SpringCloud[二]

mac2024-12-08  24

①. Feign

1>.Feign

1.简介:

Feign也叫伪装:Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做 项目主页:https://github.com/OpenFeign/feign

2. 快速入门

①. 在 consumer-demo 项目的 pom.xml 文件中添加如下依赖 <!--Feign的依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ②. 在 consumer-demo 中编写如下Feign客户端接口类: //声明当前类是一个Feign客户端,指定服务名为user-service @FeignClient(value = "user-service") public interface UserClient { //http://user-service/user/123 @GetMapping("/user/{id}") User queryById(@PathVariable Long id); }

③.编写新的控制器类 ConsumerFeignController ,使用UserClient访问: @RestController @RequestMapping("/cf") public class ConsumerFeignController { @Autowired private UserClient userClient; @GetMapping("/{id}") public User queryById(@PathVariable Long id){ return userClient.queryById(id); } } ④. 在 ConsumerApplication 启动类上,添加注解,开启Feign功能 /*@SpringBootApplication @EnableDiscoveryClient //开启Eureka客户端发现功能 @EnableCircuitBreaker //开启熔断*/ @SpringCloudApplication @EnableFeignClients public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } } ⑤. http://localhost:8080/cf/2

3.负载均衡 [ 了解 ]

前言介绍 1.Feign中本身已经集成了Ribbon依赖和自动配置: 因此不需要额外引入依赖,也不需要再注册 RestTemplate 对象 2.Fegin内置的ribbon默认设置了请求超时时长,默认是1000,我们可以通过手动配置来修改这个超时时长: 3.注意:重新给UserService的方法设置上线程沉睡时间2秒可以测试上述配置

# Feign 集成ribbon ribbon: ConnectTimeout: 1000 # 连接超时时长 ReadTimeout: 2000 # 数据通信超时时长 MaxAutoRetries: 0 # 当前服务器的重试次数 MaxAutoRetriesNextServer: 0 # 重试多少次服务 OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试

4.Hystrix支持(了解)

前言 1.Feign默认也有对Hystrix的集成: 2.只不过,默认情况下是关闭的。需要通过下面的参数来开启;

①. 首先,要定义一个类,实现刚才编写的UserFeignClient,作为fallback的处理类 @Component public class UserClientFallback implements UserClient { @Override public User queryById(Long id) { User user = new User(); user.setId(id); user.setName("用户异常"); return user; } } ②. 然后在UserFeignClient中,指定刚才编写的实现类 @FeignClient(value="userservice",fallback = UserClientFallback.class) public interface UserClient { @GetMapping("/user/{id}") User queryById(@PathVariable Long id); } ③. 重启测试[重启启动 consumer-demo 并关闭 user-service 服务,然后在页面访问:http://localhost:8080/cf/8]

5.请求压缩[了解]

步骤: 1.Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数即可开启请求与响应的压缩功能: 2.同时,我们也可以对请求的数据类型,以及触发压缩的大小下限进行设置:

compression: request: enabled: true # 开启请求压缩 mime-types: text/html,application/xml,application/json # 设置压缩的数据类型 min-request-size: 2048 # 设置触发压缩的大小下限 response: enabled: true

6.日志级别[了解]

①. 在 consumer-demo 的配置文件中设置com.itheima包下的日志级别都为debug ;修改 consumer-demo\src\main\resources\application.yml 添加如下配置: # 日志级别 logging: level: com.itheima: debug ②.在 consumer-demo 编写FeignConfig配置类,定义日志级别 @Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel(){ //记录所有请求和响应的明细,包括头信息、请求体、元数据 return Logger.Level.FULL; } }

③.在 consumer-demo 的 UserClient 接口类上的@FeignClient注解中指定配置类: @FeignClient(value="userservice", fallback = UserClientFallback.class, configuration = FeignConfig.class) public interface UserClient { @GetMapping("/user/{id}") User queryById(@PathVariable Long id); } ④. 重启项目,访问:http://localhost:8080/cf/8 ;即可看到每次访问的日志:

②. Gateway网关

2>. Gateway网关

1. Gateway网关的作用

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

2.核心概念

①. 路由(route) 路由信息的组成:由一个ID、一个目的URL、一组断言工厂、一组Filter组成。如果路由断言为真,说明请求URL和配置路由匹配

②. 断言(Predicate) Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自Http Request中的任何信息比如请求头和参数

③. 过滤器(Filter) 一个标准的Spring WebFilter。 Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理

3. 快速入门

①. 填写基本信息:

②. pom.xml

<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> ③.编写启动类 @SpringBootApplication @EnableDiscoveryClient public class GateWayApplication { public static void main(String[] args) { SpringApplication.run(GateWayApplication.class, args); } } ④. 编写路由规则 server: port: 10010 spring: application: name: api-gateway # 路由的配置 cloud: gateway: routes: # 路由id,可以任意 - id: user-service-route # 代理的服务地址 uri: http://127.0.0.1:9091 # 路由断言: 可以匹配映射路径 predicates: - Path=/user/** eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka instance: prefer-ip-address: true ⑤. 启动测试

4.面向服务的路由

前言: 在刚才的路由规则中,把路径对应的服务地址写死了!如果同一服务有多个实例的话,这样做显然不合理。应该根据服务的名称,去Eureka注册中心查找 服务对应的所有实例列表,然后进行动态路由!

①. 配置uri

②. 再次启动 heima-gateway ,这次gateway进行代理时,会利用Ribbon进行负载均衡访问:

5. 路由前缀处理

①. 添加前缀: [在gateway中可以通过配置路由的过滤器PrefixPath,实现映射路径中地址的添加; 修改 heima-gateway\src\main\resources\application.yml 文件:]

访问路径:PrefixPath=/user http://localhost:10010/8 --》http://localhost:9091/user/8

server: port: 10010 spring: application: name: api-gateway # 路由的配置 cloud: gateway: routes: # 路由id,可以任意 - id: user-service-route # 代理的服务地址 #uri: http://127.0.0.1:9091 # 路由断言: 可以匹配映射路径 # lb表示从eureka中获取具体服务 uri: lb://userservice predicates: #- Path=/user/** - Path=/** filters: # 添加请求路径的前缀 - PrefixPath=/user

②. 去除前缀 [在gateway中可以通过配置路由的过滤器StripPrefix,实现映射路径中地址的去除;] 修改 heima-gateway\src\main\resources\application.yml 文件: server: port: 10010 spring: application: name: api-gateway # 路由的配置 cloud: gateway: routes: # 路由id,可以任意 - id: user-service-route # 代理的服务地址 #uri: http://127.0.0.1:9091 # 路由断言: 可以匹配映射路径 # lb表示从eureka中获取具体服务 uri: lb://userservice predicates: - Path=/api/user/** filters: # 表示过滤1个路径,2表示两个路径,以此类推 - StripPrefix=1

③. 过滤器

3>. 过滤器

1.简介:

①. Gateway自带过滤器有几十个,常见自带过滤器有: https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.1.RELEASE/ single/spring-cloud-gateway.html#_gatewayfilter_factories ②. 项目进行配置 ③. 上述配置后,再访问 http://localhost:10010/api/user/8 的话;那么可以从其响应中查看到如下信息:

2.过滤器类型:Gateway实现方式上,有两种过滤器;

①. 局部过滤器:通过 spring.cloud.gateway.routes.filters 配置在具体路由下,只作用在当前路由上;自带的过滤器都可以配置或者自定义按照自带过滤器的方式。如果配置 spring.cloud.gateway.default-filters 上会对所有路由生效也算是全局的过滤器;但是这些过滤器的实现上都是要实现GatewayFilterFactory接口

②.全局过滤器:不需要在配置文件中配置,作用在所有的路由上;实现 GlobalFilter 接口即可

3. 自定义局部过滤器

需求: 在application.yml中对某个路由配置过滤器,该过滤器可以在控制台输出配置文件中指定名称的请求参数的值

①. 编写过滤器:[在heima-gateway工程编写过滤器工厂类MyParamGatewayFilterFact ory] package com.itheima.gateway.filter; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.List; @Component public class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory<MyParamGatewayFilterFactory.Config> { static final String PARAM_NAME = "param"; public MyParamGatewayFilterFactory() { super(Config.class); } public List<String> shortcutFieldOrder() { return Arrays.asList(PARAM_NAME); } @Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { // http://localhost:10010/api/user/8?name=itcast config.param ==> name //获取请求参数中param对应的参数名 的参数值 ServerHttpRequest request = exchange.getRequest(); if(request.getQueryParams().containsKey(config.param)){ request.getQueryParams().get(config.param). forEach(value -> System.out.printf("------------局部过滤器--------%s = %s------", config.param, value)); } return chain.filter(exchange); }; } public static class Config{ //对应在配置过滤器的时候指定的参数名 private String param; public String getParam() { return param; } public void setParam(String param) { this.param = param; } } } ②. 修改配置文件:在heima-gateway工程修改 heima-gateway\src\main\resources\application.yml 配置文件 server: port: 10010 spring: application: name: api-gateway # 路由的配置 cloud: gateway: routes: # 路由id,可以任意 - id: user-service-route # 代理的服务地址 #uri: http://127.0.0.1:9091 # 路由断言: 可以匹配映射路径 # lb表示从eureka中获取具体服务 uri: lb://userservice predicates: #- Path=/user/** #- Path=/** 前缀 - Path=/api/user/** filters: # 添加请求路径的前缀 #- PrefixPath=/user # 表示过滤1个路径,2表示两个路径,以此类推 - StripPrefix=1 - MyParam=name default-filters: # 默认过滤器会对所有路由都生效 - AddResponseHeader=X-Response-Foo, Bar eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka instance: prefer-ip-address: true ③. 测试访问:http://localhost:10010/api/user/8?name=itcast 检查后台是否输出name和itcast;但是若访问http://localhost:10010/api/user/8?name2=itcast 则是不会输出的

4.全局过滤器

需求: 模拟一个登录的校验。基本逻辑:如果请求中有token参数,则认为请求有效,放行。

①. 配置全局类 package com.itheima.gateway.filter; import org.apache.commons.lang.StringUtils; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @Component public class MyGlobalFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("--------------全局过滤器MyGlobalFilter------------------"); String token = exchange.getRequest().getQueryParams().getFirst("token"); if(StringUtils.isBlank(token)){ //设置响应状态码为未授权 exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } @Override public int getOrder() { //值越小越先执行, 当有多个过滤器的时候,值越小就越先执行 return 1; } } ②. 访问 http://localhost:10010/api/user/8 ③.访问 http://localhost:10010/api/user/8?token=abc

5.负载均衡和熔断(了解)

hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 6000 ribbon: ConnectTimeout: 1000 ReadTimeout: 2000 MaxAutoRetries: 0 MaxAutoRetriesNextServer: 0

6. Gateway跨域配置

一般网关都是所有微服务的统一入口,必然在被调用的时候会出现跨域问题。

跨域:在js请求访问中,如果访问的地址与当前服务器的域名、ip或者端口号不一致则称为跨域请求。若不解决则不能获取到对应地址的返回结果

//在gateway下进行配置 gateway: globalcors: corsConfigurations: '[/**]': #allowedOrigins: * # 这种写法或者下面的都可以,*表示全部 allowedOrigins: - "http://docs.spring.io" allowedMethods: - GET

④. Spring Cloud Config分布式配置中心

4>. Spring Cloud Config分布式配置中心

1.简介:

①. 在分布式系统中,由于服务数量非常多,配置文件分散在不同的微服务项目中,管理不方便。为了方便配置文件集中管理,需要分布式配置中心组件。在Spring Cloud中,提供了Spring Cloud Config,它支持配置文件放在配置服务的本地,也支持放在远程Git仓库(GitHub、码云)

②. 使用Spring Cloud Config配置中心后的架构如下图:

2.创建远程仓库

码云访问地址:https://gitee.com/

步骤: 1.首先要使用码云上的私有远程git仓库需要先注册帐号;请先自行访问网站并注册帐号,然后使用帐号登录码云控制台并创建公开仓库 2. 创建配置文件 3.创建 user-dev.yml

3.搭建配置中心微服务

①. 创建工程 ②. 添加依赖,修改 config-server\pom.xml 如下: <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> <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> </dependencies> ③. 启动类 ④. 配置文件application.yml server: port: 12000 spring: application: name: config-server cloud: config: server: git: uri: https://gitee.com/tangzhi520/heima-config.git eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka ⑤. 启动测试:http://localhost:12000/user-dev.yml

4. 获取配置中心配置

①. 在 user-service 工程中的pom.xml文件中添加如下依赖: <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: master discovery: # 使用配置中心 enabled: true # 配置中心服务名 service-id: config-server eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka ③. 工程结构

⑤. Spring Cloud Bus简介

5>. Spring Cloud Bus简介

1.Spring Cloud Bus的作用

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

2. Spring Cloud Bus应用

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

①. 在 config-server 项目的pom.xml文件中加入Spring Cloud Bus相关依赖

<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-server cloud: config: server: git: uri: https://gitee.com/goheima/heima-config.git # 配置rabbitmq信息;如果是都与默认值一致则不需要配置 rabbitmq: host: localhost port: 5672 username: guest password: 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的配置文件添加内容 spring: cloud: config: # 要与仓库中的配置文件的application保持一致 name: user # 要与仓库中的配置文件的profile保持一致 profile: dev # 要与仓库中的配置文件所属的版本(分支)一样 label: master discovery: # 使用配置中心 enabled: true # 配置中心服务名 service-id: config-server # 配置rabbitmq信息;如果是都与默认值一致则不需要配置 rabbitmq: host: localhost port: 5672 username: heima password: heima virtual-host: /itcast eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka ⑤. UserController的修改

⑥. Spring Cloud 体系技术综合应用概览

6>. Spring Cloud 体系技术综合应用概览

最新回复(0)