作者:mobiledu2502857147 | 来源:互联网 | 2023-08-24 14:35
1.springcloudAlibaba-nacos2.springcloudAlibaba-openFeign3.springcloudAlibaba-负载均衡器
1.springcloudAlibaba-nacos
2.springcloudAlibaba-openFeign
3.springcloudAlibaba-负载均衡器Ribbon
4.springcloudAlibaba-nacos配置中心
5.springcloudAlibaba-Seata 分布式事务
6.springcloudAlibaba-sentinel
7.springcloudAlibaba-网关gateway
目录
什么是openFeign
springcloudAlibaba整合openFeign
Spring Cloud Feign的自定义配置及使用
日志
自定义拦截器
配置超时时间
什么是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);
}