1.背景
今天我们学习SpringCloud的客户端负载均衡Ribbon
我们今天继续使用之前eureka-server作为服务注册中心
使用Springboot和springcloud的版本如下
- springboot版本:2.3.5-release
- springcloud版本:Hoxton.SR9
2.Feign服务消费
什么是feign
Feign是一个声明式的Web Service客户端,它使得编写Web Serivce客户端变得更加简单。我们只需要使用Feign来创建一个接口并用注解来配置它既可完成。它具备可插拔的注解支持,包括Feign注解和JAX-RS注解。Feign也支持可插拔的编码器和解码器。Spring Cloud为Feign增加了对Spring MVC注解的支持,还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实
- 可插拔的注解支持,包括Feign注解和JAX-RS注解;
- 支持可插拔的HTTP编码器和解码器;
- 支持Hystrix和它的Fallback;
- 支持Ribbon的负载均衡;
- 支持HTTP请求和响应的压缩。
3.如何使用
3.1 消费者
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
添加注解
@EnableFeignClients
@EnableFeignClients(basePackages = "com.wyq.springcloudfeignconsumer.service")
增加配置类
@FeignClient(name ="ms-feign-producer",path = "/api/user",configuration = Config.class,fallback = UserServiceImpl.class)
public interface UserService {
@GetMapping("/{id}")
public String selectUser(@PathVariable("id") String id);
}
配置文件
spring:
application:
name: ms-feign-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka
register-with-eureka: true
instance:
prefer-ip-address: true
#appname: ${spring.application.name}
instance-id: ${spring.cloud.client.ip-address}:${server.port}
hostname: ${spring.cloud.client.ip-address}
server:
port: 8081
使用
@RequestMapping("/api/comsumer/user")
@RestController
public class UserController {
@Autowired
UserService userService;
@GetMapping("/{id}")
public String selectUser(@PathVariable("id") String id){
return userService.selectUser(id);
}
}
3.2 生产者
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
修改配置文件
spring:
application:
name: ms-feign-producer
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka
register-with-eureka: true
instance:
prefer-ip-address: true
#appname: ${spring.application.name}
instance-id: ${spring.cloud.client.ip-address}:${server.port}
hostname: ${spring.cloud.client.ip-address}
server:
port: 8082
提供服务
@RequestMapping("/api/user")
@RestController
public class UserController {
@Value("${server.port}")
Integer port;
@GetMapping("/{id}")
public String selectUser(@PathVariable("id") String id){
if ("1".equals(id)) {
int i = 1/0;
}
User user = new User();
user.setId(id);
user.setName("wangyunqi");
user.setPort(port);
return user.toString();
}
}
4.如何设置日志级别
日志级别
- NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。
- HEADERS:记录BASIC级别的基础上,记录请求和响应的header
- FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据。
- BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。
如何设置
- 通过javaConfig方式配置
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
@FeignClient(name ="ms-feign-producer",path = "/api/user",configuration = Config.class,fallback = UserServiceImpl.class)
public interface UserService {
@GetMapping("/{id}")
public String selectUser(@PathVariable("id") String id);
}
- 通过配置文件方式
feign:
client:
config:
ms-feign-producer:
loggerLevel: full #这种方式也是可以设置日志级别
5.如何设置拦截器
在实际的开发过程中,我们可以再调用其他的服务的时候传递一些信息,我们希望通过拦截器的方式进行统一的拦截
public class BasicAuthRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
template.header("Authorization", headerValue);
}
}