一、OpenFeign
1.1 基本使用
OpenFeign是Spring Cloud在Feign的基础上支持了Spring MVC的注解,列如@RequestMapping等,OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
在shop-common
模块的pom
文件中添加OpenFeign
依赖包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
创建OpenFeign
接口,在接口上添加@FeignClient
注解,通过value
属性指定提供服务的服务名称,这个名称是注册到Nacos
中的服务名称,path
属性设置接口访问的根路径,在接口方法可以通过@RequestMapping
注解来指定访问路径,根路径与指定的访问路径拼装后才是真正的访问路径
如果需要传参数,可以像Controller
里面的接收参数一样,通过@RequestParm、@PathVariable
等来传递参数
@Component
@FeignClient(value = "shop-order",path = "order")
public interface UserToOrderFeignClient {
/**
* 订单详情
*
* @date 2022/2/8
* @param uid
* @return java.util.List<com.lizhi.entity.Order>
*/
@GetMapping("details")
List<Order> details(@RequestParam("uid") Integer uid);
}
在shop-order
服务中,编写Controller
类,同时在启动类上添加@EnableFeignClients
注解,表示允许通过OpenFeign
的方式来访问接口
@RestController
@RequestMapping
public class OrderController {
@Resource
OrderService orderService;
@GetMapping("details")
List<Order> details(@RequestParam("uid") Integer uid){
return orderService.details(uid);
}
}
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
}
配置shop-order
服务访问的根路径
spring:
mvc:
servlet:
path: /order
在shop-user
模块注入UserToOrderFeignClient
的代理对象,然后就可以直接通过调用UserToOrderFeignClient的details()
方法来调用shop-order
提供的接口
@Resource
UserToOrderFeignClient userToOrderFeignClient;
@GetMapping("test")
List<Order> test(){
return userToOrderFeignClient.details(1);
}
1.2 客户端参数配置
@FeignClient
注解的configuration
属性可以配置客户端参数,默认的配置类为FeignClientsConfiguration
,其提供了Encoder
、Decoder
、Logger
、Contract
、Retryer
、FeignClientConfigurer
等的配置
我们可以通过自定义配置类来配置这些参数,然后在@FeignClient
注解中配置configuration
属性
@Configuration
public class FeignConfiguration {
@Bean
public Contract feignContract(){...}
@Bean
public Encoder encoder(){...}
……
}
@Component
@FeignClient(value = "shop-order",path = "order",fallback = OrderFeignClientFallBack.class,configuration = FeignConfiguration.class)
public interface UserToOrderFeignClient {
@GetMapping("details")
List<Order> details(@RequestParam("uid") Integer uid);
}
除了通过配置类的方式,还可以通过配置文件来进行配置,feign.client.config
是一个Map,所以需要自定义一个KEY,下面实例把服务名shop-user
作为KEY,而属性对应于FeignClientProperties
的内部类FeignClientConfiguration
feign:
sentinel:
enabled: true
client:
config:
shop-user:
connectTimeout:
loggerLevel:
readTimeout: 5000
oggerLevel: full
encoder: com.lizhi.config.Encoder
decoder: com.lizhi.config.Decoder
contract: com.lizhi.config.Contract
1.3 断路器配置
SpringCloud断路器支持fallBack
的概念,以Sentinel
为例,演示OpenFeign中fallBack
的使用
首先在配置文件中添加feign.sentinel.enabled=true
参数,Spring配置的元数据对该参数做了详细的介绍
{
"name": "feign.sentinel.enabled",
"type": "java.lang.Boolean",
"description": "If true, an OpenFeign client will be wrapped with a Sentinel circuit breaker.",
"defaultValue": "false"
}
我们创建一个OrderFeignClientFallBack
类,让其实现UserToOrderFeignClient
这个FeignClient的接口,并把这个类定义为一个Bean
@Component
public class OrderFeignClientFallBack implements UserToOrderFeignClient {
@Override
public List<Order> details(Integer uid) {
throw new NoFallbackAvailableException("service degrade",new RuntimeException());
}
}
然后在FeignClient接口的@FeignClient
注解中,指定fallBack
对应的处理类
@Component
@FeignClient(value = "shop-order",path = "order",fallback = OrderFeignClientFallBack.class)
public interface UserToOrderFeignClient {
@GetMapping("details")
List<Order> details(@RequestParam("uid") Integer uid);
}
再集成Sentinel之后,可以对/order/detail
接口设置熔断规则,如果接口调用触发了熔断规则,就会调用fallBack
类中对应接口的方法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153619.html