2.springcloudAlibaba-openFeign
3.springcloudAlibaba-负载均衡器Ribbon
4.springcloudAlibaba-nacos配置中心
5.springcloudAlibaba-Seata 分布式事务
7.springcloudAlibaba-网关gateway
目录
什么是openFeign
Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及
WebSocket。Feign可帮助我们更加便捷、优雅地调用HTTP API Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
Spring Cloud openfeign对Feign进行了增强,使其支持Spring MVC注解,另外还整合了
Ribbon和Nacos,从而使得Feign的使用更加方便
springcloudAlibaba整合openFeign
order module中创建controller
@RestController @RequestMapping(value = "/orderController") public class OrderController { @RequestMapping(value = "/getInfo") public String getInfo() { return "获取成功:"; } }
重新创建 module customer
resources 下创建 application.yml 端口9998
server: port: 9998 spring: application: name: customer-service cloud: nacos: server-addr: 49.232.193.91:8848 discovery: username: nacos password: nacos namespace: public
在application中加入 @EnableFeignClients 注解
@EnableFeignClients @SpringBootApplication public class CustomerApplication { public static void main(String[] args) { SpringApplication.run(CustomerApplication.class); } }
创建controller
@RestController public class CustomerController { @Autowired OrderService orderService; @RequestMapping(value = "/getUserInfo") public String getUserInfo() { String result = orderService.getInfo(); return result; } }
创建 interface Service
@FeignClient(value= "order-service",path= "/orderController") public interface OrderService { @RequestMapping("/getInfo") String getInfo(); /** * 被调用方 * @RestController * @RequestMapping(value = "/orderController") * public class OrderController { * @RequestMapping(value = "/getInfo") * public String getInfo() { * return "获取成功:"; * } * } * */ }
@FeignClient(value= "order-service",path= "/orderController") 中 value 对应调用服务名
path 对应 被调用controller 的RequestMapping
调用接口 localhost:9998/getUserInfo
Spring Cloud Feign的自定义配置及使用
Feign 提供了很多的扩展机制,让用户可以更加灵活的使用
日志
全局配置
创建config类
@Configuration //如果全局配置加入Configuration 针对单个服务去掉 public class FeignConfig { /** * 通过源码可以看到日志等级有4种,分别是: * NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。 * BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及 * 执行时间。 * HEADERS:记录BASIC级别的基础上,记录请求和响应的header。 * FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body * 和元数据 */ @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
在yml中加入 log日志级别
logging: level: com.customer.service: debug
将order module复制一份 yml 端口改为 9997 服务名改为 order-service2
customer 中 为order-service 创建 interface 接口 同时在controller中调用
@FeignClient(value= "order-service2",path= "/orderController") public interface Order2Service { @RequestMapping("/getInfo") String getInfo(); /** * 被调用方 * @RestController * @RequestMapping(value = "/orderController") * public class OrderController { * @RequestMapping(value = "/getInfo") * public String getInfo() { * return "获取成功:"; * } * } * */ }
@RequestMapping(value = "/testLog") public String testLog() { String result = orderService.getInfo(); String result2 = order2Service.getInfo(); return result; }
请求 http://localhost:9998/testLog
单个服务日志
在FeignClient中加入 configuration
去掉config中Configuration 注解
还有一种方式是通过配置文件的方式
logging: level: com.customer.service: debug feign: client: config: order-service: #对应微服务 loggerLevel: FULL
自定义拦截器
在config中增加拦截类
public class FeignInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { //可以做一些 验证 权限的拦截控制 System.out.println("拦截开始-----------------------"); String access_token = UUID.randomUUID().toString(); template.header("Authorization", access_token); } }
在feignConfig中 配置
@Bean public FeignInterceptor feignAuthRequestInterceptor() { return new FeignInterceptor(); }
配置超时时间
在feignConfig 配置
@Bean public Request.Options options() { //通过Options可以配置连接超时时间和读取超时时间,Options的第一个参数是连接的超时 //时间(ms),默认值是2s;第二个是请求处理的超时时间(ms),默认值是5s return new Request.Options(5000, 10000); }