唯能极于情,故能极于剑
本文转载于:http://www.codecow.cn/
此文由四部分组成(OpenFeign简介、@FeignClient 使用、实操、总结),别着急,慢慢来
小编就不多 BB 先来张图 压压惊
这图不难理解:客服端调用服务端有两种方式 ribbon + restTemplate 或 Openfeign;
但是:在我们实际开发当中,往往 一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客服端类来包装这些依赖服务的调用 ;所以,OpenFeign在此基础上做了进一步封装,由他来帮助我们实现依赖服务接口的定义。
因此:需要我们做的非常简单,我们只需要创建一个接口并使用注解的方式来配置他,即可完成对服务提供方的接口绑定。
来两个 好男人 必备网站, 哈哈
官网:cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/#spring-cloud-openfeign(贼 慢。。。。)
GitHub:https://github.com/spring-cloud/spring-cloud-openfeign (还好,一般般)
了解OpenFeign 了,不来点 硬核 咋行呢,下面小编就结合实际开发和大家聊聊
注意:有服务端和客户端两个模块/项目
①、首先导包
<!--监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--服务注册与发现 consul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
②、改 YML 配置文件
server:
port: 8006 //端口号
spring:
application:
name: cloud-payment-service //服务名
cloud:
consul:
host: localhost //consul的IP
port: 8500 //consul启动端口默认8500
discovery:
service-name: ${spring.application.name}
prefer-ip-address: true //不写这个配置,在docker下的consul里面健康检查会失败
healthCheckInterval: 5s //健康检查频率
port: ${server.port} //注册服务所在端口
③、添加主启动类
@SpringBootApplication // springboot 注解
@EnableDiscoveryClient //作用:能够让注册中心发现,并扫描到该服务
public class ProvideMain8006 {
public static void main(String[] args) {
SpringApplication.run(ProvideMain8006.class, args);
}
}
④、业务逻辑Controller
@RestController
@Slf4j
public class PaymentController {
@Resource
private PaymentService paymentService;
@GetMapping("/payment/get/{id}")
public RespResult<Payment> getPaymentById(@PathVariable("id") Integer id) {
Payment payment = paymentService.getById(id); //getById 是serviceImpl中根据id 获取 payment 实体的方法, 小编在这就不赘述了
log.info("查询结果为:" + payment);
if (payment != null) {
return RespResult.success(payment); // RespResult 是小编自己封装的返回结果,不懂可以问小编
} else {
return new RespResult<>(444, "查询为空");
}
}
}
服务端就完事了:
自测:
url : http://localhost:8006/payment/get/1
结果 :{"code":200,"message":"成功","data":{"id":1,"desc":"98K"}}
解释 :Payment 实体就两个字段 id、desc, 通过结果可以知道 RespResult 是啥了吧
经过 小编一顿 SAO 操作, 服务端 还可以吧 ^ _ ^
注意:消费端大体和客服端一样,注意细节 O ^ _ ^
①、首先导包
<!--监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--服务注册与发现 consul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--服务调用 openFeign--> // 朋友:包其实就比服务端多一个 openFeign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
②、改 YML 配置文件
server:
port: 80 //端口号 浏览网页服务默认的端口号都是80,因此只需输入网址即可,不用输入“: 80”了
spring:
application:
name: cloud-order-service //服务名
cloud:
consul:
host: localhost //consul的IP
port: 8500 //consul启动端口默认8500
discovery:
service-name: ${spring.application.name}
prefer-ip-address: true //不写这个配置,在docker下的consul里面健康检查会失败
healthCheckInterval: 5s //健康检查频率
port: ${server.port} //注册服务所在端口
ribbon: // 此配置和 OpenFeign 超时控制 有关, 小编在这就不多赘述了,有想了解,直接给小编留言
ReadTimeout: 5000 //请求处理的超时时间 5秒
ConnectTimeout: 3000 //请求连接的超时时间 3秒
logging: // 此配置和 OpenFeign 打印日志级别有关
level:
top.msxdlb.springcloud.service.OrderService: debug //日志打印级别
③、添加主启动类
@SpringBootApplication // springboot 注解
@EnableDiscoveryClient //作用:能够让注册中心发现,并扫描到该服务
@EnableFeignClients //服务调用 注解
public class ConsumerMain80 {
public static void main(String[] args) {
SpringApplication.run(ConsumerMain80.class);
}
}
④、业务逻辑 Service
/**
* 此类作用: 不懂看 最上面 OpenFeign 是啥玩意?
* OpenFeign 能干嘛?
*/
@Component
@FeignClient("cloud-payment-service") //里面是服务端的 服务名(yml 文件中)
public interface PaymentService{
@GetMapping("/payment/get/{id}")
public RespResult<Payment> getPaymentById(@PathVariable("id") Integer id);
}
⑤、业务逻辑 Controller
@RestController
@Slf4j
public class PaymentController {
/**
* 使用 Feign 方式调用
*/
@Resource
private PaymentService paymentService; // 注入 service 中 通过 @FeignClient 定义好的接口
@GetMapping("/feign/payment/get/{id}")
public RespResult<Payment> getPayment(@PathVariable("id") Integer id) {
log.info("<<<<<<<<<<< 我是通过feign >>>>>>>>>>>>");
return paymentService.getPaymentById(id);
}
}
消费端也完事了:
总测试步骤:
1、启动服务端
2、启动消费端
3、地址栏输入url: http://localhost/feign/payment/get/1 // 为什么不加端口号(回去看 消费端 Yml 配置 有说明)
4、结果:
如果结果为:{"code":200,"message":"成功","data":{"id":1,"desc":"98K"}}
就是和服务端自测结果一样,恭喜你 成功了
如果你 有幸看到这里:
咋青山不改,绿水长流,不妨看看小编其他作品,很香哟, 呵呵
第二步OpenFeign 实操总结: 其实就两点:
①、在消费端启动类加:@EnableFeignClients 注解
②、在业务逻辑 Service 接口加: @FeignClient 注解 即可
朋友,这顿 SAO 操作 还可以吧,哈哈,加油 ^ _ ^
这是 SpringCloud 的 OpenFeign 篇,后续小编会从 “Hystrix、Gateway …” 等坚持以博客的方式来分享自己对SpringCloud 的理解,并从不同角度和大家分享工作心得,并且含有相关Demo,最终小编会发布到GitHub上,供大家下载、分享、交流、指正,下面是源码地址:
GitHub:https://github.com/msxdlb/Spring-Cloud-2020
有问题或错误请及时联系小编或关注小编公众号 “CodeCow”,小编一定及时回复和改正 啦
《 心有多大,舞台就有多大 》 人得有——理想
2020/04/16 午后