SpringCloud
1、技术选型
- springcloud 和 springboot是强依赖关系,必须使用对应的版本才不会报错
- springcloud 2020.0.x版本以后已经完全删除了netflix组件
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3F2wJp36-1631810774214)(https://i.loli.net/2021/03/20/x6XcyA9GhdRSf4Q.png)]
- springcloud版本查看官网
- 具体版本对应表
- 微服务架构!
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZVUi6ue2-1631810774216)(https://i.loli.net/2021/03/25/GEwMWHnrNijZaeS.png)]
2、eureka
2.1、server
2.1.1、依赖
- 需要注意新版本服务名称已经更改为 spring-cloud-starter-netflix-eureka-server
常用依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-server -->
<!-- 不加版本是一般使用cloud依赖自带默认的版本 注意cloud2020.0.X版本以后已经删除该功能 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.1.2、配置
server:
port: 7001
# eureka
eureka:
instance:
# 主机名称
hostname: eureka7001.com
client:
# 是否注册进eureka服务中心
register-with-eureka: false
# 是否获取服务中心的注册信息
fetch-registry: false
service-url:
# 服务中心地址url
defaultZone: http://eureka7002.com:7002/eureka/
spring:
application:
# 对外暴露的服务名称
name: cloud-eurk-server-7001
2.1.3、开启注解 简单使用
- 在主程序类中开启
@EnableEurekaServe
注解
2.1.4、集群设置
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eRw04VwK-1631810774221)(https://i.loli.net/2021/03/22/9GYQ4W1kbyPgxiH.png)]
2.2、EurekaClient
2.2.1、依赖
- 新版本(H)开始使用 spring-cloud-starter-netflix-eureka-client
常用依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client -->
<!-- 我们一般使用cloud自带的依赖 夫工程管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.2.2、配置
server:
port: 8002
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://rm-bp17g6m503q38rlx1125010hm.mysql.rds.aliyuncs.com:3306/spring_cloud?serverTimeZone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
username: zhou
password: Zyb763428
#eureka
eureka:
client:
# 表示是否将自己注册金eurekaserver
# 是否从eurekaserver 抓取已经存在的注册信息 ,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml
type-aliases-package: com.weinigb.springcloud.entities
2.2.3、简单实用
- 在主类开通
@EnableEurekaClient
注解即可以将服务注册到服务中新
2.2.4、集群配置
- 部署多个服务module 全都注册服务中心,对外暴露的服务名一样即可做到集群
2.2.5、负载均衡
- 在部署完集群环境之后,我们可以在 消费端 restTemplate的配置类 bean 中开启注解
@LoadBalanced
来开启负载均衡服务。 - 开启负载均衡以后 ,我们可以通过eureka的服务名来进行访问服务
2.3、eureka信息完善
- 可以在yaml中配置我们服务的一些基本信息
eureka
# 配置对外暴露服务的信息
instance:
# 服务的id
instance-id: payment8002
# 是否显示服务的ip
prefer-ip-address: true
2.4、服务发现Discovery
-
可以通过服务发现者来获取服务中心的已注册服务信息
@Autowired // 这个类是一个接口,springboot的一个接口!!! private DiscoveryClient discoveryClient; @GetMapping(value="/payment/discovery") public Object discovery(){ // 获得服务清单列表 List<String> services = discoveryClient.getServices(); for (String service : services) { System.out.println(service); } // 根据微服务名称 进一步获得微服务的信息 List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE"); for (ServiceInstance instance : instances) { // 打印微服务的服务id 服务主机和uri地址 log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getUri()); } return this.discoveryClient; }
3、Ribbon
导读 restTemplate
getForObject()
和getForEntitt()
的区别
3.1、依赖
- 新版的eureka 已经整合了ribbon的整合包,不需要额外添加依赖!
3.2、负载均衡方案
3.2.1、IRule接口
常用的负载均衡规则
- 从特定的算法之中选择一个你的想要的服务
负载均衡规则替换
-
自定义配置类不能存放在@componentsScan能够扫描的包及其子包下,否则我们自定义的这个配置类就会被所有的ribbon共享(就是不能和启动类放在同一目录或者同一目录下面)
-
在主启动类包的同级目录新建包 创建出Irule的实体类
MySelfRule
-
在主启动类使用注解
@RibbonClient(name = "服务名",configuration = MySelfRule.class)
来进行生效
4、openFeign
4.1、简介
-
作用
且feign 自带负载均衡功能!!
4.2、依赖
官网
依赖
<!-- 在spring cloud 已经存在版本 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
4.3、编码
首先在启动类添加@EnableFeignClients接口
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RbUQAjkj-1631810774233)(https://i.loli.net/2021/03/22/Z3voHT8ckLaYKpB.png)]
service层定义一个调用 服务提供者的接口
在控制器层直接使用即可
4.4、高级功能—超时控制
- 消费端调用服务端,服务端处理需要时间,openfeign默认等待服务端1秒,超时直接返回500错误
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YxFrvWnK-1631810774236)(https://i.loli.net/2021/03/22/PpeA5qvKU2hk4rE.png)]
- 有时候我们的业务需要处理超过一秒,因此需要打开超时控制
开启超时控制
-
1、打开配置
ribbon: # 建立连接后从服务器读取可用资源所用的时间 ReadTimeout: 5000 # 建立连接的时间,两端连接所用的时间 ConnectTimeout: 5000
- 注意!!! ribbon默认是没有这两个属性的 但是可以使用。忘记就百度。
4.5、日志打印功能
4.5.1、日志级别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p1O5gxjL-1631810774238)(https://i.loli.net/2021/03/22/3izKpCsyNT7qeO5.png)]
4.5.2、编码
-
新增一个bean配置类
@Configuration public class FeignConfig { @Bean // 设置feign的日志级别 Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
-
在yaml中新增监听接口配置
# feign 日志监控 logging: level: # 表示以什么等级监控哪个接口 表示以debug监听 PyamentFeignService接口 com.weinigb.springcloud.service.PaymentFeignService: debug
6、Hystrix
简单介绍
- 负责处理服务降级 服务熔断 服务限流 服务隔离
处理的问题
- 服务雪崩
解决方案
6.1、重要概念
- 服务降级
- 对方服务不可用了 向调用方返回一个符合预期的,可处理的备选响应(fallback)
- 触发条件
- 程序运行异常
- 超时
- 服务熔断触发服务降级
- 线程池/信号量打满也会导致服务降级
- 服务熔断
- 超过了最大访问量我们手动调用服务降级的手法
- 超过了最大访问量我们手动调用服务降级的手法
- 服务限流
- 高并发时进行排序
6.2、服务降级
6.2.1、服务端
-
1、需要在我们需要兜底的方法上添加
@HystrixCommand
注解开启服务降级-
里面需要填写
fallbackmethod
commandProperties
-
具体的 降级条件 查看百度
-
// 服务降级 失败访问下面的 paymentInfo_timeoutHandler 方法 @HystrixCommand(fallbackMethod = // 这个是超时降级的方法 "paymentInfo_timeoutHandler", // 这个是具体的超时要求 commandProperties = { // 这个指当前的线程池处理时间超过两秒就进行降级 @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000") }) // 这是一个超时方法 public String paymentInfo_timeout(Integer id){ try { TimeUnit.SECONDS.sleep(10); } catch (InterruptedException e) { log.error("------------------------------"); e.printStackTrace(); } return "线程池:"+ Thread.currentThread().getName()+"paymentInfo_timeout,id: "+id+"haha"; } // 这个是降级处理方法 public String paymentInfo_timeoutHandler(Integer id){ return "线程池:"+ Thread.currentThread().getName()+"paymentInfo_timeoutHandler,id: "+id+"wuwuw"; }
-
-
在主启动类添加
@EnableCircuitBreaker
开启服务降级功能!
6.2.2、客户端 (一般都在客户端进行服务降级,早发现早处理)
-
1、需要在配置文件开启
feign.hystrix.enabled=true
(因为客户端是使用openfeign来进行接口调用的)- 注意 开启了这个之后feign会自动将所有
@FeignClient
标记的接口进行Hystrix包装,类似直接在所有的方法上面添加@HystrixCommand
他会默认有一个一秒的超时时间,需要修改这个超时时间可以去更改Hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds==xx毫秒
来进行修改。还需要更改ribbon的超时时间
(服务端超时)
- 注意 开启了这个之后feign会自动将所有
-
2、启动类添加
@EnableHystrix
注解 该注解内部包含@EnableCircuitBreaker
-
3、设置客户端超时方案
-
使用
@HystrixCommand
注解来进行开启-
@GetMapping("/payment/hystrix/timeout/{id}") // 设置控制层超时 由于开启了feign的hystrix功能 所以服务层有个默认的1秒超时 @HystrixCommand(fallbackMethod = "paymentInfo_timeoutHandler",commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000") }) public String paymentInfo_timeout(@PathVariable("id") Integer id){ String result = paymentHystrixService.paymentInfo_timeout(id); return result; } public String paymentInfo_timeoutHandler(@PathVariable("id") Integer id){ return "error controller cloud-consumer-feign-hystrix-order-8080"; }
-
-
6.2.3、全局默认fallback
代码膨胀
-
通过配置默认的fallback方法来进行处理
-
在需要进行服务降级的类上添加注解注解:
-
@DefaultProperties(defaultFallback = "Globel_timeoutHandler")
-
然后在类中自定义降级方法,注意不能携带参数,否则会报找不到降级方法的异常
-
// 全局默认方法不能携带参数 否则会报找不到的bug public String Globel_timeoutHandler(){ return "galober error controller cloud-consumer-feign-hystrix-order-8080"; }
-
-
代码逻辑混乱
-
通过配置服务降级处理类来进行处理
-
在需要进行处理的feign接口上添加注解:
-
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
-
随后在fallback类中添加与需要进行降级处理类方法同名的方法
- 服务降级类[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KM0zopzG-1631810774242)(https://i.loli.net/2021/03/25/aEM4lxkX1Fr5Dzc.png)]
- 服务方法[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8lgFiJpc-1631810774243)(https://i.loli.net/2021/03/25/bmCL8nIyMU5vFza.png)]
-
6.3、服务熔断
原理
-
断路器在什么情况下开始起作用?
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cHRXh59h-1631810774246)(https://i.loli.net/2021/03/25/wpEjGor6aWqVR7d.png)]
-
断路器开启或者失败的条件
-
断路器打开之后
6.3.1、编码
注释: 依赖和上面的降级依赖完全一致。
-
在seveive层添加配置 (服务端)
- 当服务端调用失败次数超过我们配置的时候就会开启断路器。详情请查看下面的配置。
// -------------------- 熔断配置 1 @HystrixCommand( /** * 这里表示在10000毫秒内 10次访问有6次失败就开启断路器 * 流程: * 1、 请求次数达到峰值次数,切失败率到达指定程度,在这一个时间窗口期打开断路器 断路器状态转变为开启(open) * 2、 在下一个时间窗口期,会将断路器设置为半开状态(Half Open) 尝试让一些请求通过,如果请求失败则 * 继续为open开启状态,成功则断路器则进入close 关闭状态,重复第一步 * */ fallbackMethod = "paymentCircuitBreaker_fallback", commandProperties = { // 是否开启断路器(服务熔断) @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), // 请求次数 峰值次数 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), // 时间窗口期 单位是毫秒 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 失败率达到多少后跳闸 错误百分比 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60") } ) public String paymentCiruitBreaker(@PathVariable("id") Integer id) { if (id < 0) { throw new RuntimeException(("-----id 不能为复数")); } String serialNumber = IdUtil.simpleUUID(); return Thread.currentThread().getName() + "\t" + "调用成功,流水号:" + serialNumber; } public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id) { return "id 不能为复数,请稍后再试,QAQ id:" + id; }
6.3.2、所有配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VgjwOB53-1631810774250)(https://i.loli.net/2021/03/25/YQMX36o1Rsz8Ubq.png)]
6.4、图形化界面配置(Hystrix DashBoard)
- 图解观看
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DW15AQtR-1631810774253)(https://i.loli.net/2021/03/25/kh5uEWVaCR2JDXq.png)]
6.4.1、依赖
-
需要导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency>
6.4.2、配置
- 需要配置端口号 一般推荐使用9001
6.4.3、编码
- 在主启动类添加注解
@EnableHystrixDashboard
来开启服务 - 打开测试
6.4.4、注意事项
-
需要在被监听服务的启动类添加配置(默认路径错误)
/** * 此配置是为了服务监控配置,与服务容器本身无关,springcloud升级之后产生的坑 * servletRegistrationBean因为springboot的默认路径不是 “/hystrix.stream”, * 只要在自己的项目里配置上下面的servlet就可以了 */ @Bean public ServletRegistrationBean getServlet(){ HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; }
-
需要被监控类添加
actuator
依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
7、Gateway服务网关
7.1、简介
-
是什么?
-
能干啥
-
和zuul的区别
-
zuul1模型
-
webFlux
7.2、三大概念
简单图表
7.2.1、Route(路由)
- 路由时构建网关的基本模块,它由id,目标url,一系列的断言和过滤器组成,如果断言为true则匹配该路由
7.2.2、Predicatie(断言)
- 开发人员可以匹配Http请求中所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
7.2.3、Filter(过滤)
- 值得是spring框架中GatewayFilter的实例,使用过滤器可以在请求被路由前或者之后对请求进行修改
7.2.4、总体
- 流程
7.3、正式编码
7.3.1、依赖
-
需要引入gateway的依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
7.3.2、配置
通过yaml进行配置
spring:
application:
name: cloud-gateway
cloud:
gateway:
routes:
# 当我们访问 localhost:port/payment/get/** 的时候会自动映射到localhost:8001/payment/get/{id}
- id: payment_routh #payment_route # 路由的ID没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 # 匹配提供服务的路由地址
predicates:
- Path=/payment/get/** # 断言,匹配的服务地址
- id: payment_routh2
uri: http://localhost:8001
predicates:
- Path=/payment/create
通过配置类进行配置
package com.weinigb.springcloud.config;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author Wenigb
* @version V1.0
* @Package com.weinigb.springcloud.config
* @date 2021/3/26 9:00
* @Copyright © 每天都是开心的一天呢
*/
@Configuration
public class GateWayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
/**
* 这里表示当我们访问本机的 localhost:port/guonei的时候会自动映射到 http://news.baidu.com/guonei
*/
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("path_route_weinigb",
r->r.path("/guonei")
.uri("http://news.baidu.com/guonei"))
.build();
return routes.build();
}
}
7.4、微服务名称编码
- 通过链接注册中心来直接通过微服务名称来进行调用指定的服务
7.4.1、依赖
-
首先需要导入eureka-client 客户端依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
导入gateway依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
7.4.2、配置
-
需要eureka的配置和gateway的配置
spring: application: name: cloud-gateway cloud: gateway: routes: # 当我们访问 localhost:port/payment/get/** 的时候会自动映射到localhost:8001/payment/get/{id} - id: payment_routh #payment_route # 路由的ID没有固定规则但要求唯一,建议配合服务名 uri: lb://CLOUD-PAYMENT-SERVICE # 匹配提供服务的路由地址 匹配后提供服务的路由地址 predicates: - Path=/payment/get/** # 断言,匹配的服务地址 - id: payment_routh2 uri: lb://CLOUD-PAYMENT-SERVICE predicates: - Path=/payment/create discovery: locator: # 开启从注册中心动态创建路由的功能 enabled: true server: port: 9527 eureka: instance: hostname: cloud-gateway-service client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
7.4.3、测试
- 在主启动类添加eureka的注解
@EnableEurekaClient
- 启动进行测试
7.5、断言的使用
断言简介
7.5.1、After(时间条件、表示之后才能访问)
-
表示在我们指定的时间之后才允许访问
-
配置文件书写
spring: application: name: cloud-gateway cloud: gateway: routes: # 当我们访问 localhost:port/payment/get/** 的时候会自动映射到localhost:8001/payment/get/{id} - id: payment_routh #payment_route # 路由的ID没有固定规则但要求唯一,建议配合服务名 uri: lb://CLOUD-PAYMENT-SERVICE # 匹配提供服务的路由地址 匹配后提供服务的路由地址 predicates: - Path=/payment/get/** # 断言,匹配的服务地址 - After=2021-03-28T12:10:15.405+08:00[Asia/Shanghai]
-
时间格式获取方法
@Test public void test(){ ZonedDateTime zonedDateTime = ZonedDateTime.now(); // 2021-03-28T12:10:15.405+08:00[Asia/Shanghai] System.out.println(zonedDateTime); }
7.5.2、Before(时间条件、表示之前才能访问)
-
在我们指定的时间之前才可以访问
-
使用配置
predicates: - Path=/payment/get/** # 断言,匹配的服务地址 - Before=2021-03-28T12:10:15.405+08:00[Asia/Shanghai]
7.5.3.between (在两个时间之间)
-
在我们指定的时间之间
-
使用配置
predicates: - Path=/payment/get/** # 断言,匹配的服务地址 - Before=2021-03-28T12:10:15.405+08:00[Asia/Shanghai],2021-03-28T12:10:15.405+08:00[Asia/Shanghai]
7.5.4、cookie(cookie判定)
-
判断cookie是否符合确定的参数
- cookie Route Predicate 需要两个参数,一个是cookiename 一个是正则表达式
- 路由规则会通过获取对应的cookie name 值和正则比表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。
predicates: - Path=/payment/get/** # 断言,匹配的服务地址 - Before=2021-03-28T12:10:15.405+08:00[Asia/Shanghai],2021-03-28T12:10:15.405+08:00[Asia/Shanghai] # 携带cookie的key 和cookie的value 只有匹配才会允许请求 - Cookie=key,value
7.5.5、Header(请求头判定)
-
需要我们的请求头中携带者我们指定的key,value
-
配置:
predicates: # 请求头携带的key value 需要同我们指定的一样 - Header=Key,value
7.5.6、Host(主机判定)
-
需要我们的请求头中的主机与我们指定的类路径一样
-
配置
predicates: Host=**.weinigb.com,**.gzccc.com # 表示只有所有匹配的路由能够进来,可以通过逗号添加等多个
7.5.7、Method(请求方法判定)
-
根据我们的请求方法进行断言
-
配置:
predicates: - Method=GET,POST # 只有指定的请求方法能够匹配断言
7.5.8、Path(路径判定)
-
根据我们指定的路径来进行判定
-
配置
predicates: - Path=/red/{id} # 只有匹配对应的路径才可以匹配断言
7.5.9、Query(参数判定)
-
根据我们指定的参数类型和值类型来进行判断
-
配置
predicates: - Query=key,\d+ # 表示只有携带参数key且Value是正数才可以进行访问呢
7.6、Filter(过滤器)
简介
生命周期
- pre: 在业务逻辑之前
- post:在业务逻辑之后
种类
- GatewayFilter : 单一的
- GlobalFilter:全局的
7.6.1、自带的过滤器
- 直接去官网复制粘贴来进行使用。
7.6.2、自定义过滤器
-
1、实现两个自带的接口
GlobalFilter
和Ordered
两个接口 -
2、编码
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("--------------"+new Date()); String name = // 获取请求流参数! exchange.getRequest().getQueryParams().getFirst("name"); // return // 获取响应流 exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); // return null; // 继续下一个过滤器 return chain.filter(exchange); } @Override public int getOrder() { // 过滤器优先级,数字越小优先级越大 return 0; }
8、config(服务配置)
简介
是什么
- spingcloud config为微服务架构中微服务提供集中化的外部配置支持,配置服务器为各个不同的微服务应用的所有环境提供了一个中心化的外部配置
怎么用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wre4Zid7-1631810774267)(https://i.loli.net/2021/03/28/D2CoYvVPXnNxM69.png)]
8.1、配置中心构建
8.1.1、依赖
-
需要导入config和eureka的依赖 // 因为是从服务中心读取配置
<!-- Eureka client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- Config --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency>
8.1.2、配置
-
在配置文件中配置git仓库地址和读取数据
server: port: 3344 spring: application: # eureka 服务名 name: cloud-config-center cloud: config: server: git: # git仓库地址 uri: https://gitee.com/weinigb/springcloud-config.git # git搜索路径 search-paths: - springcloud-config # git用户名 username: 763428006@qq.com # git密码 password: 1342562987Z123z # git分支 label: master eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
8.1.3、测试
- 在主启动类添加
@@EnableConfigServer
和@EnableEurekaClient
注解 - 在浏览器上搜索路径
http://localhost:3344/master/config-dev.yml
- localhost:3344 是端口
- master 是分支
- config-dev.yal 是文件名
8.1.4、配置读取规则
- /{label}/{application}-{profile}.yml
- 代表:http://config-3344.com:3344/master/config-dev.yml
- 声明了分支就不会去找我们设置的分支
- /{application}-{profile}.yml
- 代表: http://config-3344.com:3344/config-dev.yml
- 默认去找我master分支
- /{application}/{profile}[/{label}]
- 代表:http://config-3344.com:3344/config/dev/master
- 将分支写在最后面
8.1.5、拓展
- 可以使用本地配置文件(不需要在git搭建版本控制)
- 详情参考:转载自虚无境的博客
8.2、配置客户端
8.2.1、bootstrap.yml
简介
8.2.2、编码
8.2.2.1、依赖
需要导入 spring-cloud-starter-config和eureka依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
8.2.2.2、配置
server:
port: 3355
spring:
application:
name: config-client
cloud:
config:
# config 客户端配置 下面三个加起来的链接 http://localhost:3344/master/config-dev.yml
label: master # 分支名称
name: config # 配置文件名称
profile: dev # 配置文件环境
uri: http://localhost:3344 # 配置中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka
fetch-registry: true
register-with-eureka: true
8.2.2.3、测试
-
先自测通过 3344 测试方法参考上面
-
编辑控制器层
@RestController public class ConfigClientController { // 这里是读取我们加载进来的配置文件中的变量属性 @Value("${config.info}") private String configInfo; @GetMapping("/configInfo") public String getConfigInfo(){ return configInfo; } }
-
编写启动类 (开启
@EnableEurekaClient
)
8.2.3、动态刷新
-
使用前需要添加依赖
actuator
依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
增加配置
# 监控端点 management: endpoints: web: exposure: include: "*"
-
在业务类上添加
@RefreshScope
注解@RestController @RefreshScope public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/configInfo") public String getConfigInfo(){ return configInfo; } }
-
使用方法
-
每次配置修改完成之后需要发送一个请求到3355客户端来请求刷新(手动刷新)
-
必须是post请求
-
路径是:http://localhost:3355/actuator/refresh
-
9、Bus(消息总线)
简介
作用
- 为了解决分布式架构下上面的配置中心无法无法自动刷新的问题
- 为了解决通知一次全部刷新问题
9.1、RabbitMq和Erlang安装
9.1.1、erlang
下载地方
安装
- 无脑下一步
9.1.2、Rabbitmq
注意
- 需要先安装erlang运行环境
下载地方
安装
- 无脑下一步
后续
- 需要在安装目录下的
sbin
文件夹中运行rabbitmq-plugins.bat enable rabbitmq_management
- 目的是为了开启插件
测试
- 在windows服务中检查 rabbitmq服务是否开启成功
- 打开浏览器 输入 localhost:15672 能否进入rabbit监控中心
- 默认账号密码 都是 guest
9.2、配置中心
使用需要连接服务中心 (如eureka)
9.2.1、依赖
-
需要导入cloud-cloud-starter-bus-amqp
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>
9.2.2、配置
-
导入rabbit配置和actuator配置
# rabbitmq相关设置 暴露bus刷新配置端点 management: endpoints: # 暴露bus刷新配置端点 web: exposure: include: 'bus-refresh' spring: # rabbitmq 相关配置 rabbitmq: host: localhost port: 5672 username: guest password: guest
9.2.3、测试
- 启动项目进行测试。
9.3、配置客户端
凡是监控信息的都需要导入actuator依赖
9.3.1、依赖
-
需要导入spring-cloud-starter-bus-amqp的依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>
9.3.2、配置
-
配置rabbit和监控端口
spring: # rabbitmq 配置 rabbitmq: host: localhost port: 5672 username: guest password: guest # eureka配置 eureka: client: service-url: defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka # actuator配置 management: endpoints: web: exposure: include: "*"
9.3.3、使用
-
在需要更新的服务类上添加
@RefreshScope
注解 -
注意!!!
- 如果没有在需要加载新配置的服务类上标明该注解,则配置的同步不会同步到该服务类。
-
@RestController @RefreshScope public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/configInfo") public String getConfigInfo(){ return configInfo; } }
9.4、消息通知
9.4.1、全局通知
- 向配置中心所在url路径发送post请求
- 例如3344是配置中心所在微服务,向/actuator/bus-refresh路径发送post请求则会刷新所有配置中心客户端
- http://localhost:3344/actuator/bus-refresh
9.4.2、定点通知
- 只定点刷新我们想要刷新的微服务,在发送刷新请求的时候指定一个微服务
- http://localhost:3344/actuator/bus-refresh/CONFIG-CLIENT:3355
- 路径后边跟着 {服务名称}:{服务端口}