修订日期 | 内容 |
---|---|
2021-2-17 | 初稿 |
3-Spring Cloud微服务快速搭建-Feign(OpenFeign)整合
简述
我们都知道各个微服务会分开部署,那么服务之间如何通信呢?(比如:订单微服务
需要查询物流微服务
的物流信息),一般我们可以使用httpclient调用接口返回数据(比如json)就可以实现了。
feign也是在这个基础上更进一步,实现了如下功能:
- 各微服务直接的通信看起来像是本地调用一样(仅仅只是看起来像,省去了拼装解析报文,填写http的服务地址等步骤,其实也是http调用)
- 负载均衡
(以上废话有点多,不看也行,下面直接开撸)
配置实现
1.引入maven依赖
<!-- 引入openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.创建feign客户端(暴露接口)
- 提供一个服务
@RequestMapping(value = "/query/{id}")
public String query(@PathVariable Long id){
logger.info("开始调用物流信息:id={}",id);
try {
//测试熔断时使用
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "查询物流信息成功id:"+id;
}
- 在调用服务方中创建feign客户端
使用@FeignClient注解声明客户端
【坑点】注意服务名千万不要有下划线,可以使用中划线
// name = 被调用的服务方名称,注意千万不要有下划线,可以使用中划线
@FeignClient(name = "express-service")
public interface ExpressFeign {
//请注意将完整路径写在方法上,否则在hystrix熔断时可能会出现错误,该服务controller请自行实现
@RequestMapping(value = "/express/query/{id}")
String query(@PathVariable Long id);
}
- 在启动类中添加激活Feign调用
@SpringBootApplication
// 激活客户端 ,新版本可以省略
//@EnableEurekaClient,@EnableDiscoveryClient
// 激活feign调用
@EnableFeignClients
public class OrderServiceApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(OrderServiceApplication.class).run(args);
}
ExpressFeign 则可以直接@Resource引入调用即可
如何避免开发调试时服务乱跳
一般在开发环境,多人同时开发时很多人的服务都注册到同一个注册中心,自己新增的方法有时无法调用,如何解决呢?可以使用指定固定URL为本机的方式
下面express.debug.url
建议写在配置文件中,这样本地代码可以提交,生产上不用配置即可
@FeignClient(name = "express-service",url = "${express.debug.url}")
//@RequestMapping("/express")
public interface ExpressFeign {
}
express.debug.url=http://localhost:8080[自己的端口号]
# 生产环境不指定URL即可
express.debug.url=