欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

spring cloud(二)

发布时间:2023/11/29 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 spring cloud(二) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1. Feign应用

Feign的作用;使用Feign实现consumer-demo代码中调用服务

  • 导入启动器依赖;
  • 开启Feign功能;
  • 编写Feign客户端;
  • 编写一个处理器ConsumerFeignController,注入Feign客户端并使用;
  • 测试
  • <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency> @SpringCloudApplication @EnableFeignClients public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}@Bean@LoadBalancedpublic RestTemplate get(){return new RestTemplate();} } @FeignClient("user-service") public interface UserClient {@GetMapping("/user/{id}")User get(@PathVariable long id); } @RestController @RequestMapping("/cf") public class ConsumerFeignController {@Autowiredprivate UserClient userClient;@GetMapping("/{id}")public User get(@PathVariable long id){return userClient.get(id);} }

    Feign主要作用:自动根据参数拼接http请求地址。

    2. Feign负载均衡及熔断

    目标:可以配置Feign内置ribbon配置项和Hystrix熔断的Fallback配置

    分析

    • 负载均衡
    • 服务熔断
    • 请求压缩
    • 日志级别
    ribbon:ConnectTimeout: 1000 # 连接超时时长ReadTimeout: 2000 # 数据通信超时时长MaxAutoRetries: 0 # 当前服务器的重试次数MaxAutoRetriesNextServer: 0 # 重试多少次服务OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试 feign:hystrix:enabled: true # 开启Feign的熔断功能compression:request:enabled: true # 开启请求压缩mime-types: text/html,application/xml,application/json # 设置压缩的数据类型min-request-size: 2048 # 设置触发压缩的大小下限response:enabled: true logging:level:com.gogo: debug @Component public class UserClientFallback implements UserClient{@Overridepublic User get(long id) {User user = new User();user.setId(id);user.setName("异常用户");return user;} } @Configuration public class FeignConfig {@BeanLogger.Level logLevel(){return Logger.Level.FULL;}} @FeignClient(value = "user-service",fallback = UserClientFallback.class,configuration = FeignConfig.class) public interface UserClient {@GetMapping("/user/{id}")User get(@PathVariable long id); }

    Spring Cloud Gateway的核心就是一系列的过滤器,可以将客户端的请求转发到不同的微服务。主要作用:过滤和路由。

    4. Spring Cloud Gateway入门

    需求:通过网关系统heima-gateway将包含有 /user 的请求 路由到 http://127.0.0.1:9091/user/用户id

    实现步骤:

  • 创建工程;
  • 添加启动器依赖;
  • 编写启动引导类和配置文件;
  • 修改配置文件,设置路由信息;
  • 启动测试
  • <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency></dependencies> server:port: 10010 spring:application:name: api-gatewaycloud:gateway:routes:- id: user-service-routeuri: http://127.0.0.1:9091predicates:- Path=/user/**eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eurekainstance:prefer-ip-address: true

    5. 面向服务的路由

    使用在eureka注册的服务作为路由地址

    如果将路由服务地址写死明显是不合理的;在Spring Cloud Gateway中可以通过配置动态路由解决。

    面向服务的路由;只需要在配置文件中指定路由路径类似: lb://user-service

    lb 之后编写的服务名必须要在eureka中注册才能使用

    server:port: 10010 spring:application:name: api-gatewaycloud:gateway:routes:- id: user-service-routeuri: lb://user-servicepredicates:- Path=/**filters:# 添加请求路径的前缀- PrefixPath=/usereureka:client:service-url:defaultZone: http://127.0.0.1:10086/eurekainstance:prefer-ip-address: true

    6. 路由前缀处理

    可以对请求到网关服务的地址添加或去除前缀

    提供服务的地址:http://127.0.0.1:9091/user/8

    • 添加前缀:对请求地址添加前缀路径之后再作为代理的服务地址;

    http://127.0.0.1:10010/8 --> http://127.0.0.1:9091/user/8 添加前缀路径/user

    • 去除前缀:将请求地址中路径去除一些前缀路径之后再作为代理的服务地址;

    http://127.0.0.1:10010/api/user/8 --> http://127.0.0.1:9091/user/8 去除前缀路径/api

    server:port: 10010 spring:application:name: api-gatewaycloud:gateway:routes:- id: user-service-routeuri: lb://user-servicepredicates:- Path=/**filters:# 添加请求路径的前缀- PrefixPath=/usereureka:client:service-url:defaultZone: http://127.0.0.1:10086/eurekainstance:prefer-ip-address: true filters:# 添加请求路径的前缀- StripPrefix=1

    客户端的请求地址与微服务的服务地址如果不一致的时候,可以通过配置路径过滤器实现路径前缀的添加和去除。

    7. 过滤器简介

    • 用法:在配置文件中指定要使用的过滤器名称;
    • 类型:局部、全局;
    • 使用场景:请求鉴权、异常处理、记录调用时长等。

    8. 自定义局部过滤器

    按照默认过滤器编写并配置一个自定义局部过滤器,该过滤器可以通过配置文件中的参数名称获取请求的参数值

    需求:在过滤器(MyParamGatewayFilterFactory)中将http://localhost:10010/api/user/8?name=itcast中的参数name的值获取到并输出到控制台;并且参数名是可变的,也就是不一定每次都是name;需要可以通过配置过滤器的时候做到配置参数名。

    实现步骤:

  • 配置过滤器;
  • 编写过滤器;
  • 测试
  • spring:application:name: api-gatewaycloud:gateway:routes:- id: user-service-routeuri: lb://user-servicepredicates:- Path=/api/user/**filters:# 添加请求路径的前缀- StripPrefix=1- My=namedefault-filters:- AddResponseHeader=X-Response-Default-MyName, gogo @Component public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.config> {public static final String PARAM_NAME = "param";@Overridepublic GatewayFilter apply(config config) {return ((exchange, chain) -> {ServerHttpRequest request = exchange.getRequest();if(request.getQueryParams().containsKey(config.param))request.getQueryParams().get(config.param).forEach(var-> System.out.println(config.param+var));return chain.filter(exchange);});}public MyGatewayFilterFactory() {super(config.class);}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList(PARAM_NAME);}@Datapublic static class config{String param;} }

    9. 自定义全局过滤器

    定义一个全局过滤器检查请求中是否携带有token参数

    需求:编写全局过滤器,在过滤器中检查请求地址是否携带token参数。如果token参数的值存在则放行;如果token的参数值为空或者不存在则设置返回的状态码为:未授权也不再执行下去。

    实现步骤:

  • 编写全局过滤器;
  • 测试
  • @Componentpublic class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("全局------------------");String token = exchange.getRequest().getQueryParams().getFirst("token");if(StringUtils.isBlank(token)){exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {return 1;} }

    10. Gateway其它配置说明

    Gateway网关的负载均衡和熔断参数配置

    server:port: 10010 spring:application:name: api-gatewaycloud:gateway:routes:- id: user-service-routeuri: lb://user-servicepredicates:- Path=/api/user/**filters:# 添加请求路径的前缀- StripPrefix=1- My=namedefault-filters:- AddResponseHeader=X-Response-Default-MyName, gogoglobalcors:corsConfigurations:'[/**]':#allowedOrigins: * # 这种写法或者下面的都可以,*表示全部allowedOrigins:- "http://docs.spring.io"allowedMethods:- GETeureka:client:service-url:defaultZone: http://127.0.0.1:10086/eurekainstance:prefer-ip-address: truehystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 6000 ribbon:ConnectTimeout: 1000ReadTimeout: 2000MaxAutoRetries: 0MaxAutoRetriesNextServer: 0

    Gateway网关一般直接给终端请求使用;Feign一般用在微服务之间调用。

    11. Spring Cloud Config分布式配置中心简介

    目标:分布式配置中心的作用

    小结

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mg8yPP56-1614310505789)(assets/1560919656472.png)]

    spring cloud config作用:可以通过修改在git仓库中的配置文件实现其它所有微服务的配置文件的修改。

    12. 搭建配置中心微服务

    创建码云的远程公开git仓库,搭建配置中心微服务config-server

    • 创建git仓库:在码云上创建仓库

    • 搭建配置中心config-server:使用spring boot方式搭建和配置

    • 配置中心依赖

    <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency></dependencies>
    • 配置中心的配置文件
    eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eurekainstance:prefer-ip-address: trueserver:port: 12000 spring:application:name: config-servercloud:config:server:git:uri: https://gitee.com/Gogo-gitee/config.git

    在gitee中修改了配置文件会在配置中心服务及时更新。

    13. 获取配置中心配置

    需求:将服务提供工程user-service的application.yml配置文件删除,修改为从配置中心config-server中获取。

    实现步骤:

  • 添加启动器依赖;
  • 修改配置文件;
  • 启动测试
  • 将原来的application.yml删除;然后添加bootstrap.yml配置文件,该文件也是spring boot的默认配置文件,其内容经常配置一些项目中固定的配置项。如果是项目经常变动的应该配置到application.yml中,现在使用了配置中心则应该配置到git仓库中对于的配置文件。

    • 依赖
    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId><version>2.1.1.RELEASE</version></dependency>
    • 配置文件bootstrap.yml
    spring:cloud:config:# 要与仓库中的配置文件的application保持一致name: user# 要与仓库中的配置文件的profile保持一致profile: dev# 要与仓库中的配置文件所属的版本(分支)一样label: masterdiscovery:# 使用配置中心enabled: true# 配置中心服务名service-id: config-servereureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka

    14. Spring Cloud Bus简介

    目标:了解Spring Cloud Bus作用

    小结

    Spring Cloud Bus作用:将git仓库的配置文件更新,在不重启系统的情况下实现及时同步到各个微服务。

    15. Spring Cloud Bus应用

    需求:在码云的git仓库中修改user-dev.yml配置文件,实现不重启user-service的情况下可以及时更新配置文件。

    实现步骤:

  • 启动RabbitMQ;
  • 修改配置中心config-server;
  • 修改服务提供工程user-service;
  • 测试
    • config-server的依赖添加内容
    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-bus</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stream-binder-rabbit</artifactId></dependency>
    • config-server的配置文件添加内容
    server:port: 12000 spring:application:name: config-servercloud:config:server:git:uri: https://gitee.com/goheima/heima-config.git# 配置rabbitmq信息;如果是都与默认值一致则不需要配置rabbitmq:host: localhostport: 5672username: guestpassword: guest eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka management:endpoints:web:exposure:# 暴露触发消息总线的地址include: bus-refresh
    • user-service的依赖添加内容
    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-bus</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stream-binder-rabbit</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
    • user-service的配置文件添加内容
    # 配置rabbitmq信息;如果是都与默认值一致则不需要配置rabbitmq:host: localhostport: 5672username: guestpassword: guest
    • UserController的修改
    @RestController @RefreshScope public class HelloController {@Autowiredprivate DataSource dataSource;@AutowiredUserService userService;@Value("${test}")private String test;@GetMapping("/user/{id}")public User query(@PathVariable long id){return userService.queryId(id);}@GetMapping("/hello")public String hello(){return "hello "+test;} }

    总结

    以上是生活随笔为你收集整理的spring cloud(二)的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。