spring cloud 简单学习,快速构建基础架子

2023-11-22 03:30

本文主要是介绍spring cloud 简单学习,快速构建基础架子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.comclient:# 是否注册进eureka服务中心register-with-eureka: false# 是否获取服务中心的注册信息fetch-registry: falseservice-url:# 服务中心地址urldefaultZone: http://eureka7002.com:7002/eureka/
spring:application:# 对外暴露的服务名称name: cloud-eurk-server-7001
2.1.3、开启注解 简单使用
  • 在主程序类中开启 @EnableEurekaServe 注解
    • image-20210322090218971
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: 8002spring:application:name: cloud-payment-servicedatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://rm-bp17g6m503q38rlx1125010hm.mysql.rds.aliyuncs.com:3306/spring_cloud?serverTimeZone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: zhoupassword: Zyb763428
#eureka
eureka:client:# 表示是否将自己注册金eurekaserver# 是否从eurekaserver 抓取已经存在的注册信息 ,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
mybatis:mapper-locations: classpath:mybatis/mapper/*.xmltype-aliases-package: com.weinigb.springcloud.entities
2.2.3、简单实用
  • 在主类开通 @EnableEurekaClient 注解即可以将服务注册到服务中新
    • image-20210322091046820
2.2.4、集群配置
  • 部署多个服务module 全都注册服务中心,对外暴露的服务名一样即可做到集群
2.2.5、负载均衡
  • 在部署完集群环境之后,我们可以在 消费端 restTemplate的配置类 bean 中开启注解@LoadBalanced 来开启负载均衡服务。
  • 开启负载均衡以后 ,我们可以通过eureka的服务名来进行访问服务
    • image-20210322091312908
    • image-20210322091332758

2.3、eureka信息完善

  • 可以在yaml中配置我们服务的一些基本信息
    • image-20210322091756514
eureka# 配置对外暴露服务的信息instance:# 服务的idinstance-id: payment8002# 是否显示服务的ipprefer-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() 的区别
    • image-20210322104249836

3.1、依赖

  • 新版的eureka 已经整合了ribbon的整合包,不需要额外添加依赖!

3.2、负载均衡方案

3.2.1、IRule接口

常用的负载均衡规则

  • 从特定的算法之中选择一个你的想要的服务
    • image-20210322104513537
    • image-20210322104547693

负载均衡规则替换

  • 自定义配置类不能存放在@componentsScan能够扫描的包及其子包下,否则我们自定义的这个配置类就会被所有的ribbon共享(就是不能和启动类放在同一目录或者同一目录下面)

  • 在主启动类包的同级目录新建包 创建出Irule的实体类 MySelfRule

    • image-20210322111935528
  • 在主启动类使用注解@RibbonClient(name = "服务名",configuration = MySelfRule.class) 来进行生效

4、openFeign

4.1、简介

  • image-20210322142443979

  • 作用

    • image-20210322142548829

    且feign 自带负载均衡功能!!

4.2、依赖

官网

  • spring-cloud-starter-openFeign

依赖

<!-- 在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层定义一个调用 服务提供者的接口

  • image-20210322145424267

在控制器层直接使用即可

  • image-20210322145526887

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、日志打印功能

image-20210322153207982

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

简单介绍

  • 负责处理服务降级 服务熔断 服务限流 服务隔离

处理的问题

  • 服务雪崩
    • image-20210322154454968

解决方案

  • image-20210322154521846

6.1、重要概念

  • 服务降级
    • 对方服务不可用了 向调用方返回一个符合预期的,可处理的备选响应(fallback)
    • 触发条件
      • 程序运行异常
      • 超时
      • 服务熔断触发服务降级
      • 线程池/信号量打满也会导致服务降级
  • 服务熔断
    • 超过了最大访问量我们手动调用服务降级的手法
      • image-20210322163014770
  • 服务限流
    • 高并发时进行排序

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的超时时间 (服务端超时)
  • 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")
      
    • 然后在类中自定义降级方法,注意不能携带参数,否则会报找不到降级方法的异常

      •     //  全局默认方法不能携带参数  否则会报找不到的bugpublic 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、服务熔断

原理

  • image-20210325184306915

  • image-20210325193509635

  • 断路器在什么情况下开始起作用?

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cHRXh59h-1631810774246)(https://i.loli.net/2021/03/25/wpEjGor6aWqVR7d.png)]
  • 断路器开启或者失败的条件

    • image-20210325194157141
  • 断路器打开之后

    • image-20210325194310354
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、所有配置

image-20210325194413561

image-20210325194523423

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VgjwOB53-1631810774250)(https://i.loli.net/2021/03/25/YQMX36o1Rsz8Ubq.png)]

6.4、图形化界面配置(Hystrix DashBoard)

  • image-20210325200441012
  • 图解观看image-20210325203504766
  • image-20210325203516082[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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就可以了*/@Beanpublic 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、简介

  • 是什么?

    • image-20210325204748446
    • image-20210325204832933
  • 能干啥

    • image-20210325205034419
    • image-20210325205059144
  • 和zuul的区别

    • image-20210325205253368
  • zuul1模型

    • image-20210325205409439image-20210325205439378
  • webFlux

    • image-20210325205547146

7.2、三大概念

简单图表

image-20210325210130055

7.2.1、Route(路由)
  • 路由时构建网关的基本模块,它由id,目标url,一系列的断言和过滤器组成,如果断言为true则匹配该路由
7.2.2、Predicatie(断言)
  • 开发人员可以匹配Http请求中所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
7.2.3、Filter(过滤)
  • 值得是spring框架中GatewayFilter的实例,使用过滤器可以在请求被路由前或者之后对请求进行修改
7.2.4、总体
  • 流程
    • image-20210325210247207

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-gatewaycloud: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_routh2uri: http://localhost:8001predicates:- 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 {@Beanpublic 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-gatewaycloud: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_routh2uri: lb://CLOUD-PAYMENT-SERVICEpredicates:- Path=/payment/creatediscovery:locator:# 开启从注册中心动态创建路由的功能enabled: true
    server:port: 9527
    eureka:instance:hostname: cloud-gateway-serviceclient:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
    
7.4.3、测试
  • 在主启动类添加eureka的注解 @EnableEurekaClient
  • 启动进行测试

7.5、断言的使用

断言简介

image-20210328113622124

7.5.1、After(时间条件、表示之后才能访问)
  • 表示在我们指定的时间之后才允许访问

  • 配置文件书写

    spring:application:name: cloud-gatewaycloud: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]
    
  • 时间格式获取方法

        @Testpublic 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(过滤器)

简介

image-20210328160717715

生命周期

  • pre: 在业务逻辑之前
  • post:在业务逻辑之后

种类

  • GatewayFilter : 单一的
  • GlobalFilter:全局的
7.6.1、自带的过滤器
  • 直接去官网复制粘贴来进行使用。
7.6.2、自定义过滤器
  • 1、实现两个自带的接口 GlobalFilterOrdered两个接口

  • 2、编码

        @Overridepublic 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);}@Overridepublic int getOrder() {// 过滤器优先级,数字越小优先级越大return 0;}
    

8、config(服务配置)

简介

image-20210328192512890

是什么

  • 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-centercloud: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 是文件名
  • image-20210328222448602
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

简介

image-20210329082533326

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-clientcloud:config:# config 客户端配置  下面三个加起来的链接 http://localhost:3344/master/config-dev.ymllabel: master # 分支名称name: config # 配置文件名称profile: dev # 配置文件环境uri: http://localhost:3344 # 配置中心地址eureka:client:service-url:defaultZone: http://localhost:7001/eureka,http://localhost:7002/eurekafetch-registry: trueregister-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(消息总线)

简介

image-20210329094537099image-20210329103949258

作用

  • 为了解决分布式架构下上面的配置中心无法无法自动刷新的问题
  • 为了解决通知一次全部刷新问题

9.1、RabbitMq和Erlang安装

9.1.1、erlang

下载地方

  • erlang官网

安装

  • 无脑下一步
9.1.2、Rabbitmq

注意

  • 需要先安装erlang运行环境

下载地方

  • RabbitMq官网
  • 官网下载地址
  • gitbuh下载地址

安装

  • 无脑下一步

后续

  • 需要在安装目录下的 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: localhostport: 5672username: guestpassword: 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: localhostport: 5672username: guestpassword: 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
    • 路径后边跟着 {服务名称}:{服务端口}

图片数据依赖——尚硅谷springcloudB站教学

这篇关于spring cloud 简单学习,快速构建基础架子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/407179

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项