不少小伙伴让我整理下有关SpringCloud和SpringCloudAlibaba的知识点,经过3天的收集和整理,冰河整理出这份4万字的SpringCloud与SpringCloudAlibaba学习笔记!!

文章已收录到:

https://github.com/sunshinelyz/technology-binghe

https://gitee.com/binghe001/technology-binghe

ap 高可用 分布式容错

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  8. </dependency>
  9. eureka:
  10. instance:
  11. hostname: eureka7003.com #eureka服务端的实例名称
  12. instance-id: payment8001
  13. prefer-ip-address: true
  14. client:
  15. register-with-eureka: false #false表示不向注册中心注册自己。
  16. fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
  17. service-url:
  18. #集群指向其它eureka
  19. #defaultZone: http://eureka7002.com:7002/eureka/
  20. #单机就是7001自己
  21. defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
  22. #server:
  23. #关闭自我保护机制,保证不可用服务被及时踢除
  24. #enable-self-preservation: false
  25. #eviction-interval-timer-in-ms: 2000
  1. @EnableEurekaServer
  2. @EnableDiscoveryClient
  3. @LoadBalanced
  4. public RestTemplate getTemp() {
  5. return new RestTemplate();
  6. }

cp 强一致 分布式容错

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.apache.zookeeper</groupId>
  7. <artifactId>zookeeper</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.zookeeper</groupId>
  13. <artifactId>zookeeper</artifactId>
  14. <version>3.6.1</version>
  15. </dependency>
  16. spring:
  17. application:
  18. name: cloud-zoo-consumer-order
  19. cloud:
  20. zookeeper:
  21. connect-string: 192.168.10.58:2181
  22. @SpringBootApplication
  23. @EnableDiscoveryClient

cp 强一致 分布式容错

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  4. </dependency>
  5. spring:
  6. application:
  7. name: consul-payment-provider
  8. cloud:
  9. consul:
  10. host: 192.168.10.58
  11. port: 8500
  12. discovery:
  13. service-name: ${spring.application.name}
  14. @SpringBootApplication
  15. @EnableDiscoveryClient
  1. 在springboot 包扫描外层建立 配置
  1. @Configuration
  2. public class Myrule {
  3. @Bean
  4. public IRule initRule() {
  5. return new RandomRule();
  6. }
  7. }
  1. 启动类给指定服务加载随机方法
  1. @RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = Myrule.class)
  1. 添加maven依赖
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>
  1. 启动类启用Feign
  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @EnableDiscoveryClient
  4. @EnableFeignClients
  1. 新建接口 并注册Feign信息
  1. @Component
  2. @FeignClient(value = "CLOUD-PAYMENT-SERVICE") //提供方服务名
  3. public interface Service {
  4. @GetMapping(value = "/payment/get/{id}")
  5. Response<Payment> getPaymentById(@PathVariable("id") Long id);
  6. }
  1. 提供方接口演示
  1. @GetMapping(value = "/payment/get/{id}")
  2. public Response<Payment> getPaymentById(@PathVariable("id") Long id) {
  3. Payment payment = paymentService.getPaymentById(id);
  4. if (payment != null) {
  5. return Result.success(200, "查询成功,serverPort: " + serverPort, payment);
  6. } else {
  7. return Result.success(444, "没有对应记录,查询ID: " + id, null);
  8. }
  9. }
  1. ribbon:
  2. #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
  3. ReadTimeout: 5000
  4. #指的是建立连接后从服务器读取到可用资源所用的时间
  5. ConnectTimeout: 5000
  1. 配置Openfeign 日志级别
  1. @Configuration
  2. public class FeignLogConfig {
  3. @Bean
  4. public Logger.Level getLevel() {
  5. return Logger.Level.FULL;
  6. }
  7. }
  1. yml 项目配置文件中,给指定Feign interface 配置日志级别
  1. logging:
  2. level:
  3. ml.ytooo.feignservice.Service: debug
  • 服务降级 出险异常时,返回友好提示,防止程序异常或者阻塞
  • 服务熔断 保险丝,当超出服务承载能力时,返回提示,拒绝请求
  • 服务限流 闸门,配置服务承载能力

主方法

  1. @EnableCircuitBreaker

需要降级处理的程序

其中

  • paymentInfo_TimeOut 为预计超时程序
  • paymentInfo_TimeOut_Handler 为超时备选方案
  1. @HystrixCommand(fallbackMethod = "paymentInfo_TimeOut_Handler", commandProperties = {
  2. @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
  3. })
  4. public String paymentInfo_TimeOut(Integer id) {
  5. int time = 5;
  6. try { TimeUnit.MILLISECONDS.sleep(time * 1000); } catch (InterruptedException e) { e.printStackTrace(); }
  7. return "线程池: " + Thread.currentThread().getName() + " paymentInfo_TimeOut,id: " + id + "\t" + "O(∩_∩)O哈哈~" + " 耗时(秒): " + time;
  8. }
  9. public String paymentInfo_TimeOut_Handler(Integer id) {
  10. return "线程池: " + Thread.currentThread().getName() + " paymentInfo_TimeOut_Handler,id: " + id + "\t" + "o(╥﹏╥)o";
  11. }

配置 defaultFallback 的走自己的降级方法,未配置的走 默认@DefaultProperties 指定的降级方法

  1. @RestController
  2. @Slf4j
  3. @DefaultProperties(defaultFallback = "globle",commandProperties = {
  4. @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")
  5. })
  6. public class Controller {
  7. @HystrixCommand
  8. @GetMapping("/timeout/{id}")
  9. public String paymentInfo_TimeOut(@PathVariable("id") Integer id) {
  10. String result = feignService.paymentInfo_TimeOut(id);
  11. log.info("*****result: " + result);
  12. return result;
  13. }
  14. public String globle() {
  15. return "全局";
  16. }
  17. }
  1. 新增feign调用接口的实现类 FeignServiceImpl,实现全部方法并做降级处理
  1. @Service
  2. public class FeignServiceImpl implements FeignService {
  3. @Override
  4. public String paymentInfo_OK(Integer id) {
  5. return "降级 -- paymentInfo_OK";
  6. }
  7. @Override
  8. public String paymentInfo_TimeOut(Integer id) {
  9. return "降级 -- paymentInfo_TimeOut";
  10. }
  11. }
  1. feign调用接口添加注解
  1. @FeignClient(value = "CLOUD-PROVIDER-HYSTYRIX-PAYMENT",fallback = FeignServiceImpl.class)
  • 服务过载时,拒绝连接请求直接调用降级方法,返回异常
  • 请求下降时,慢慢恢复该服务访问,直达完全恢复

配置服务的熔断:

一下配置在 10s 内 ,10次请求有60% 失败,则熔断

HystrixProperty 配置位于 HystrixCommandProperties.class 类中

  1. //=====服务熔断
  2. @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = { //
  3. @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器
  4. @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),// 请求次数
  5. @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), // 时间窗口期
  6. @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少百分百后跳闸
  7. })
  8. public String paymentCircuitBreaker(@PathVariable("id") Integer id)
  9. {
  10. if(id < 0)
  11. {
  12. throw new RuntimeException("******id 不能负数");
  13. }
  14. String serialNumber = IdUtil.simpleUUID();
  15. return Thread.currentThread().getName()+"\t"+"调用成功,流水号: " + serialNumber;
  16. }
  17. public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id) //熔断后降级方法
  18. {
  19. return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~ id: " +id;
  20. }

效果: 当连续使用 -100 请求时, 返回 “id 不能负数”, 使用100请求也返回 “id 不能负数” ,继续连续使用 100请求, 服务慢慢恢复

使用 springcloud 阿里巴巴 sentinel 替代

  1. 添加maven依赖
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-gateway</artifactId>
  4. </dependency>
  1. 移除以下依赖
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-actuator</artifactId>
  8. </dependency>
  1. yml 配置 (后续移步配置中心)
  1. spring:
  2. application:
  3. name: cloud-gateaway-gateaway
  4. cloud:
  5. gateway:
  6. discovery:
  7. locator:
  8. enabled: true
  9. routes:
  10. - id: payment_get
  11. # uri: http://127.0.0.1:8001 #单一节点
  12. uri : lb://CLOUD-PAYMENT-SERVICE /#启用 注册中心集群
  13. predicates:
  14. - Path=/payment/get/**
  1. 注册进 Eureka 注册中心
  1. 开启 网关发现注册中心服务
  1. spring:
  2. application:
  3. name: cloud-gateaway-gateaway
  4. cloud:
  5. gateway:
  6. discovery:
  7. locator:
  8. enabled: true

断言是判断转发请求的条件

  1. predicates:
  2. - After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai]
  1. After,Before,Between 配置转发生效时间
  1. public static void main(String[] args) {
  2. ZonedDateTime now = ZonedDateTime.now();
  3. System.out.println(now);
  4. }
  5. // 2020-08-24T14:23:57.171+08:00[Asia/Shanghai]
  1. Cookie 请求需携带指定Cookie才可以访问
  1. predicates:
  2. - Cookie=name,ytooo # key,value
  1. Header ≈ Cookie
  1. predicates:
  2. - Header=name,ytooo # key,value
  1. (默认过滤器) 官方提供一系列过滤器,供我们 在请求转发之前,对请求进行加工处理
  1. filters:
  2. - AddRequestParamter=rowid,1024
  1. 自定义过滤器

自定义全局过滤器

  1. @Component
  2. @Slf4j
  3. public class GatewayLogFilter implements GlobalFilter, Ordered {
  4. @Override
  5. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  6. log.info("=====================进入全局过滤器=====================");
  7. String name = exchange.getRequest().getQueryParams().getFirst("name");
  8. if (null == name) {
  9. exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
  10. return exchange.getResponse().setComplete();
  11. }
  12. return chain.filter(exchange);
  13. }
  14. @Override
  15. public int getOrder() {
  16. return 0;
  17. }
  18. }
  1. 建立git仓库 https://github.com/sunshinelyz/cloud-config
  2. 引入 maven
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-config-server</artifactId>
  4. </dependency>

3.启动类使配置生效

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @EnableConfigServer
  4. public class ConfigMain3344 {
  5. public static void main(String[] args) {
  6. SpringApplication.run(ConfigMain3344.class, args);
  7. }
  8. }
  1. 配置 配置文件
  1. spring:
  2. application:
  3. name: cloud-config-center
  4. cloud:
  5. config:
  6. server:
  7. git:
  8. uri: https://github.com/sunshinelyz/cloud-config
  9. search-paths:
  10. - cloud-config
  11. label: master
  1. 请求访问 : http://127.0.0.1:3344/master/config-dev.yml
  1. 引入 maven
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-config-client</artifactId>
  4. </dependency>
  1. 配置 配置文件
  1. spring:
  2. application:
  3. name: cloud-condig-client
  4. cloud:
  5. config:
  6. label: master # 分支
  7. name: config # 配置文件名称
  8. profile: dev # 版本
  9. uri: http://127.0.0.1:3344 # config服务端地址

不建议使用

使用消息总线触发服务端的 bus/refresh 端点,刷新所有客户端config配置

客户端,服务端都需要实现Springcloud Config功能

  1. 引入maven依赖
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-bus-amqp</artifactId>
  4. </dependency>
  1. 配置文件中配置消息队列信息
  1. # 配置消息队列
  2. rabbitmq:
  3. host: 192.168.10.58
  4. port: 5672
  5. username: ytooo
  6. password: ytooo
  1. 配置文件中配置BUS总线暴露信息
  1. # 配置bus暴露端点
  2. management:
  3. endpoints:
  4. web:
  5. exposure:
  6. include: "bus-refresh"
  1. 配置文件预览
  1. server:
  2. port: 3344
  3. spring:
  4. application:
  5. name: cloud-config-center
  6. cloud:
  7. config:
  8. server:
  9. git:
  10. uri: https://github.com/sunshinelyz/cloud-config
  11. search-paths:
  12. - cloud-config
  13. label: master
  14. # 配置消息队列
  15. rabbitmq:
  16. host: 192.168.10.58
  17. port: 5672
  18. username: ytooo
  19. password: ytooo
  20. eureka:
  21. instance:
  22. prefer-ip-address: true
  23. instance-id: cloud-config-center-3344
  24. client:
  25. fetch-registry: true
  26. register-with-eureka: true
  27. service-url:
  28. defaultZone: http://eureka7001.com:7001/eureka/ #,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  29. # 配置bus暴露端点
  30. management:
  31. endpoints:
  32. web:
  33. exposure:
  34. include: "bus-refresh"
  1. 引入maven依赖
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-bus-amqp</artifactId>
  4. </dependency>
  1. 配置文件中配置消息队列信息
  1. # 配置消息队列
  2. rabbitmq:
  3. host: 192.168.10.58
  4. port: 5672
  5. username: ytooo
  6. password: ytooo
  1. 配置暴露端点
  1. # 配置暴露端点
  2. management:
  3. endpoints:
  4. web:
  5. exposure:
  6. include: "*"
  1. 调用配置类添加 @RefreshScope
  1. @RestController
  2. @RefreshScope
  3. public class Controller {
  4. @Value("${config.info}")
  5. private String configInfo;
  6. @GetMapping(value = "/test")
  7. public String test() {
  8. return configInfo;
  9. }
  10. }

POST 请求config服务端 http://127.0.0.1:3344/actuator/bus-refresh

刷新成功

POST 请求config服务端 http://127.0.0.1:3344/actuator/bus-refresh/{destination}

destination: 注册中心服务名称:端口号

版权声明:本文为binghe001原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/binghe001/p/14466792.html