原创

SpringCloud全家桶学习笔记之精益求精的未来

这次的文章纯属博主学习的时候自己做的笔记,丢到博客里面是方便以后随时能看,也希望能帮到需要的朋友,可能不太详细,大家可以整合然后再自己增加一些内容,也可以评论提交给我,我直接补充上去.

一.服务注册

  • 1.Eureka spring cloud原生自带 现在已经停止更新
  • 2.zookeeper 老技术公司比较合适
  • 3.consul 不太推荐 上手比较复杂
  • 4.Nacos springcloudAlibaba的,非常适合高并发的百万级以上注册量 能实现完美替换Eureka

区别

- eureka
  1. 依赖:依赖ZooKeeper
  2. 应用内/外:直接集成到应用中,依赖于应用自身完成服务的注册与发现,
  3. ACP原则:遵循AP(可用性+分离容忍)原则,有较强的可用性,服务注册快,但牺牲了一定的一致性。
  4. 版本迭代:目前已经不进行升级
  5. 集成支持:只支持SpringCloud集成
  6. 访问协议:HTTP
  7. 雪崩保护:支持雪崩保护
  8. 界面:英文界面,不符合国人习惯
  9. 上手:容易
    - consul
  10. 依赖:不依赖其他组件
  11. 应用内/外:属于外部应用,侵入性小
  12. ACP原则:遵循CP原则(一致性+分离容忍) 服务注册稍慢,由于其一致性导致了在Leader挂掉时重新选举期间真个consul不可用。
  13. 版本迭代:目前仍然进行版本迭代
  14. 集成支持:支持SpringCloud K8S集成
  15. 访问协议:HTTP/DNS
  16. 雪崩保护:不支持雪崩保护
  17. 界面:英文界面,不符合国人习惯
  18. 上手:复杂一点
    - nacos
  19. 依赖:不依赖其他组件
  20. 应用内/外:属于外部应用,侵入性小
  21. ACP原则:通知遵循CP原则(一致性+分离容忍) 和AP原则(可用性+分离容忍)
  22. 版本迭代:目前仍然进行版本迭代
  23. 集成支持:支持Dubbo 、SpringCloud、K8S集成
  24. 访问协议:HTTP/动态DNS/UDP
  25. 雪崩保护:支持雪崩保护
  26. 界面:中文界面,符合国人习惯
  27. 上手:极易,中文文档,案例,社区活跃

二.服务调用1

  • 1.Ribbon 正处于维护中
  • 2.LoadBalancer 还处于发展中

二-1服务调用2

  • 1.Feign 也是停更
  • 2.OpenFeign spring cloud自己出的

三.熔断器

  • 1.Hystrix 也是快停更,但是国内正在大规模使用,官网不推荐使用
  • 2.Resilience4J 官网推荐的
  • 3.Sentinel spring cloudAlibaba

四.服务网关

  • 1.zuul 也是停更
  • 2.gateway spring出的 官网推荐的

五.服务配置

  • 1.config 能用不推荐了
  • 2.Nacos

六.服务总线

  • 1.Bus
  • 2.Nacos

从上看出Nacos 可以替换很多技术 重点学习推荐


小知识:

dependencyManagement和dependencies区别

前者存在于父POM中管理包版本,并不会引入依赖,后者才是引入依赖,当子项目引入依赖不写版本号的时候就会沿用父POM的声明,写了则会引用当前版本,类似于方法重写和继承


大多数业务相关模块都需要引入的依赖,还缺啥就自己去补

<!-- boot start-->
 <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
    </dependency>
<!-- boot end-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.10</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

项目热部署Devtools,首先引入依赖(子POM)和插件(父POM)

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>

    <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>

其次:在设置里面找到Build开头选项,打开找到Compiler
将Automatically,Display,Build,Compile开头的几个打上勾勾,然后回到父POM中输入快捷键 ctrl+alt+shift+/
弹出框.选择Registry,
compiler.automake.allow.when.app.running
actionSystem.assertFocusAccessFromEdt
这两个打上勾.然后在application.yml中添加下方代码最后重启Idea,就可以实现热部署,这样可以避免代码变更就都需要手动重启,大大提高开发效率.

==切记开发完毕以后必须关闭热部署!!!!!==

spring:
    devtools:
        restart:
            enabled: true
单机版Eureka注册中心

互相注册,相互守望,对外暴露一个

负载均衡为什么能实现,
负载均衡轮询算法=rest接口第几次请求%服务器集群数=实际调用服务器位置下标 服务器重启后重新从1开始计算
,其底层实现机制就CAS和自旋锁
举例:

总数3台.
1%3 = 1 ==>index就是1  相当于list.get(index);
2%3 = 2 ==>index就是2  相当于list.get(index);
3%3 = 0 ==>index就是0  相当于list.get(index);
4%3 = 1 ==>index就是1  相当于list.get(index);
5%3 = 2 ==>index就是2  相当于list.get(index);
......n次

Hystrix(豪猪哥)重要概念

  • 服务降级
  • 服务器繁忙,稍后再试,并且返回给客户端一个友好提示,fallback.
    1. 什么情况下发生服务降级:程序运行异常,超时,服务熔断触发降级,线程池/信号量打满也会
  • 服务熔断
  • 服务达到最大访问量,直接拒绝访问,然后调用服务降级返回提示
  • 服务限流
  • 禁止一窝蜂的访问服务,设定多少时间访问多少个,高并发常用

Hystrix服务降级解决方案:

  1. 超时引起的服务响应变慢(如某些方法执行特别久,或者其他原因超时了)----让其别等待了
  2. 业务执行出错了----出错要有保底机制

业务方法中添加注解:

@HystrixCommand(fallbackMethod = "TimeOutHandler",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")//峰值3秒
    })

加了此注解以后,不论是你的方法超过3秒,还是运行异常,都会通过TimeOutHandler这个方法返回给用户一个比较直观的内容,而不是各种报错信息.
通常服务降级可以配置在服务端也可以配置在客户端,但是大多数都会配置与客户端中.

如果全部这样配置的话则会造成代码膨胀业务代码混乱等问题,此时则需要配置全局异常异常处理,为接口层添加默认回调方法@DefaultProperties(defaultFallback="xxx"),此时方法上则只需要配置@HystrixCommand即可.

还有一种方法则是在feign接口处使用追加注解参数,fallback=xxx.class 这个xxx类则是feign接口实现类,具体实现的则是出错时的一些响应


服务熔断是应对雪崩效应的一种微服务保护机制,当检测到某个节点响应正常后恢复调用链路.
开启 关闭 半开启


网关

springboot2.0以下的时候用zuul最合适.2.0+则是采用最新的gateway,现今学习的版本基础均是2.0以上版本.所以主要讲的gateway.

gateway是非阻塞式模型,基于webflux+netty实现

三大核心概念:

  1. Route-路由
  2. Predicate-断言
  3. Filter-过滤

动态路由配置

spring:
    cloud:
        gateway:
            discovery:
                locator:
                    enabled: true #开启动态路由
#                   lowerCaseServiceId: true #大小写

常用的predicate可在spring官网查询
spring官网

Filter-官网可查

  1. 自定义全局过滤器-实现GlobalFilter,Ordered
正文到此结束