文章目录
Spring Cloud Alibaba系列二:openFeign 实现服务间的通信
spring cloud alibaba 有严格的版本要求,所以一定要选对 spring cloud 版本,以及 spring boot 的版本
此系列文章的版本选取如下:
- Spring Cloud 版本:Spring Cloud 2021.0.1
- Spring Boot 版本:2.6.3
- Spring Cloud Alibaba 版本:2021.0.1.0
Spring Cloud Alibaba系列一:nacos 注册中心
Spring Cloud Alibaba系列二:openFeign 实现服务间的通信
Spring Cloud Alibaba系列三:集成Gateway实现路由管理
Spring Cloud Alibaba系列四:集成 seata 实现分布式事务
前言
上篇文章我们实现了 nacos 作为注册中心,并且成功地在 nacos 管理后台看见了注册成功地服务。这篇文章主要用来记录 spring cloud alibaba 集成 openfeign 作为服务的通信。在以往的 springboot 作为微服务的框架,常用的方式就是使用 zookeeper + dubbo 的方式实现服务的注册和通信。dubbo 是利用 netty 来实现服务间的通信,而openFeign 是通过 http 的方式来实现服务间的通信。更多的内容可以搜索各种文档来深入研究。
1、创建 customer 子模块
参考第一篇创建 provider 方式,创建 customer 子模块。修改端口号和应用名称:
server:
port: 8083
servlet:
context-path: /customer
spring:
application:
name: customer
profiles:
active: dev
其他的配置和 provider 模块的配置一样。
在 pom 文件中添加 openfeign 相关的依赖:
<!--openFeign 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
2、修改 provider 模块,添加服务提供接口
在 provider 模块新建一个 Controller,提供一个简单地接口:
package cn.xzf.provider.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/demo")
public class ProviderDemoController {
@GetMapping("/test")
public String test() {
return "我是provider";
}
}
3、修改 customer 模块,调用 provider 服务
3.1、创建 ProviderDemoFeign
该文件是一个 interface,实现对 provider子模块 里的接口的调用:
package cn.xzf.customer.service.openfeign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
@Component
@FeignClient(value = "provider", path = "/provider/demo")
public interface ProviderDemoFeign {
@GetMapping("/test")
String test();
}
@FeignClient 这个注解里
value或者name 的值就是服务提供者的应用名称,也就是provider 模块里配置的 spring.application.name;
path的值是服务提供者 @RequestMapping 里配置的路径。
注意:
如果你服务提供者配置了 server.servlet.context-path,那么上述 path 里一定要以 server.servlet.context-path 开始,不然访问就会报 404
3.2、修改 CustomerApplication
在启动类上加上下面的注解,毕竟要作为 openfeign 的客户端,那么我们得让客户端生效不是。
// basePackages 是指向 customer 里 实现 feign 的包
@EnableFeignClients(basePackages = "cn.xzf.customer.service.openfeign")
3.3、添加 Controller
创建一个 CustomerDemoController,测试一下。
package cn.xzf.customer.controller;
import cn.xzf.customer.service.openfeign.ProviderDemoFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/demo")
public class CustomerDemoController {
@Autowired
private ProviderDemoFeign providerDemoFeign;
@GetMapping("/test")
public String test() {
return "我是Customer";
}
@GetMapping("/p")
public String testProvider() {
return providerDemoFeign.test();
}
}
4、验证
依次启动 provider 和 customer,在 nacos 的可以看见两个服务都注册上去了:
在浏览器分别访问接口:
localhost:8082/provider/demo/test
localhost:8083/customer/demo/test
localhost:8083/customer/demo/p
可见,openFeign 已经可用了,我们通过 localhost:8083/customer/demo/p 成功获取了服务提供者的数据。
上述就是 集成openfeign实现服务通信的快速过程。