导图社区 SpringCloud
这是一篇关于SpringCloud的思维导图,主要内容有服务注册与发现、服务调用、熔断器、网关。
编辑于2022-08-29 12:48:39 北京市SpringCloud

服务注册与发现
Eureka集群:相互之间配置对方的ip,端口,服务名
Eureka注册中心搭建
创建SpringBoot子模块 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>  
服务注册
创建SpringBoot模块,作为服务提供者 依赖Eureka-server <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> 
服务注册中心的安全性
限制外界模块对服务中心的注册和调用:  浏览器访问Eureka需要账号和密码 服务提供者模块中需要配置账号和密码 
服务调用
Ribbon
创建SpringBoot模块 依赖eureka server ribbon 配置文件  启动类  Controller --->Service--->ServiceImpl(进行通过服务注册中心调用服务提供者) 调用Eureka中注册的服务提供者 在启动类或者单独创建一个config包下创建一个@Configuration类,进行RestTemplate对象的生成 @LoadBalanced注解   流程图  ============================================== Ribbon进行服务调用的参数传递  put/post请求传参  get请求传参 
Feign
创建SpringBoot模块 依赖 web eureka-server openfeign 配置文件  启动类添加注解  服务调用  post传参   get传参 
熔断器
基于Ribbon服务调⽤的熔断器使⽤
服务消费者的 服务降级
创建springboot项目,搭建环境  消费者ServiceImpl类中调用服务提供者的业务方法 进行标注降级配置 @Service public class OrderAddServiceImpl implements OrderAddService{ @Autowired private RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "fallbackSaveOrder", commandProperties = { @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000") } ) public ResultVO saveOrder(Order order) { ResultVO vo =restTemplate.postForObject("http://order-add/order/add", order, ResultVO.class); System.out.println(vo); return vo; } /** * 降级⽅法:与业务⽅法拥有相同的参数和返回值 * @return */ public ResultVO fallbackSaveOrder(Order order){ return ResultVO.fail("⽹络异常,请重试!",null); } }
服务生产者的服务降级
依赖配置和服务消费者一样 代码如下,在controller中添加注解 
基于Feign服务调⽤的熔断器使⽤(Feign是基于Ribbon和Hystrix的封装)
创建springboot项目 环境搭建   业务 创建降级类   
熔断器仪表盘监控
创建springboot项目     
网关
使用Nginx实现网关服务

使用Gateway实现网关服务
创建SpringBoot应用,添加gateway依赖 
 断言:  Path 根据请求路径的正则匹配 spring: application: name: gateway-server cloud: gateway: routes: - id: aaa uri: http://localhost:8001 predicates: - Path=/product/** #http://网关ip:网关端口/product/add 自动匹配到 http://localhost:8001 - id: bbb uri: http://localhost:8002 predicates: - Path=/order/** Query 根据请求携带的参数匹配路由 spring: application: name: gateway-server cloud: gateway: routes: - id: aaa uri: http://localhost:8001 predicates: # 如果请求url中带有name参数 ---> http://localhost:8001 - Query=name - id: bbb uri: http://localhost:8002 predicates: #如果请求url中带有pwd参数 ---> http://localhost:8002 - Query=pwd Header 根据Header中携带的参数匹配 spring: application: name: gateway-server cloud: gateway: routes: - id: aaa uri: http://localhost:8001 predicates: - Header=token - id: bbb uri: http://localhost:8002 predicates: - Header=aa,haha ========================== 过滤器: spring: application: name: gateway-server cloud: gateway: routes: - id: aaa uri: http://localhost:8001 predicates: - Path=/red/aaa/product/** filters: - AddRequestHeader=token,wahahaawahaha - AddRequestParameter=username, ergou - SetStatus=404 # - RewritePath=/red(?<segment>/?.*), $\{segment} - StripPrefix=2 代码中通过controller类进行参数的获取  ------- 自定义过滤器 创建网关过滤器 - 实现GatewayFilter public class MyFilter01 implements GatewayFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); System.out.println("---------------⾃定义过滤器"); return chain.filter(exchange); } @Override public int getOrder() { //Ordered对过滤器进行排序 return 0; } } 配置过滤器 (替代配置文件中的网关配置) @Configuration public class GatewayConfig { @Bean public RouteLocator routeLocator(RouteLocatorBuilder builder){ System.out.println("-----------------------init"); RouteLocator routeLocator = builder.routes().route( r-> r.path("/product/**") // predicates .filters(f->f.filters( new MyFilter01() )) // filters .uri("http://localhost:8001") //uri ).build(); return routeLocator; } } 第二种创建网关过滤器方法 要求:类名必须同内置的过滤一致,即GatewayFilterFactory结尾 继承AbstractNameValueGatewayFilerFactory 自动会被加载到内置过滤器中管理   全局过滤器,不仅仅针对某个路由(服务中) Gateway提供了内置的全局过滤器默认生效,会拦截所有到达网关的请求 根据业务自定义全局过滤器对多有网关请求进行拦截处理  Gateway动态路由配置 即将Gateway模块也注册到注册中心上,而Gateway本身的配置中不在写死路由ip   
网关限流
网关限流算法:  ======================= Gateway网关限流   配置服务的限流规则 (只针对- id: bbb限流) server: port: 9999 spring: application: name: gateway-server main: web-application-type: reactive cloud: gateway: routes: - id: aaa uri: lb://api-service1 predicates: - Path=/product/** - id: bbb uri: lb://api-service2 predicates: - Path=/order/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 1 #令牌桶每s的填充速度 redis-rate-limiter.burstCapacity: 2 # 令牌桶容量 redis-rate-limiter.requestedTokens: 1 key-resolver: "#{@keyResolver}" redis: host: 47.96.11.185 port: 7001 password: qfedu123 database: 0 lettuce: pool: max-active: 10 max-wait: 1000 max-idle: 5 min-idle: 3 eureka: client: service-url: defaultZone: http://localhost:8761/eureka