本文用一个简单的例子演示openfeign的简单使用。
0、环境
- jdk 1.8
- nacos-server 2.0.3
- springboot 2.4.2
- Idea 2021.1
1、项目结构
各模块说明:
- spring-cloud-nacos-sample-api: 对外开发的接口
- spring-cloud-nacos-sample-provider: 服务的提供者,也就是接口的具体实现
- spring-cloud-nacos-sample-consumer:服务的消费者
2、搭建过程
撸代码之前,请大家先把nacos环境搭建好,关于nacos的搭建,可以参考我的另一篇博文:nacos环境搭建
2.1 spring-cloud-nacos-sample
Idea创建普通maven项目,并引入如下依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
</parent>
<dependencyManagement>
<dependencies>
<!--spring cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.2、spring-cloud-nacos-sample-api
新增module, spring-cloud-nacos-sample-api,创建完成后,新建接口,代码如下:
public interface IHelloService {
String sayHello(String name);
}
2.3、spring-cloud-nacos-sample-provider
新建module,spring-cloud-nacos-sample-proivder。这个模块要对外提供服务,所以要加入依赖。
<dependencies>
<dependency>
<groupId>com.jackie.nacos.test</groupId>
<artifactId>spring-cloud-nacos-sample-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2.3.1、新建接口,实现IHelloService。代码如下:
@Service
public class HelloServiceImpl implements IHelloService {
@Override
public String sayHello(String name) {
return "Hi, " + name;
}
}
2.3.2、创建Controller,代码如下:
@RestController
@RequestMapping("/provider")
@Slf4j
public class HelloController {
@GetMapping("/sayHello")
public String sayHello(@RequestParam("name") String name) {
return service.sayHello("--------" + name);
}
@Autowired
IHelloService service;
}
2.3.3、创建springboot启动文件
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
2.3.4、添加配置文件
server:
port: 9090
spring:
application:
name: nacos-sample-provider
cloud:
nacos:
discovery:
# Nacos的服务注册地址,可以配置多个,逗号分隔
server-addr: 192.168.3.99:8848,192.168.3.99:8948
service: nacos-sample-provider
heart-beat-interval: 5000
heart-beat-timeout: 20000
# 元数据部分 - 可以自己随便定制
metadata:
mydata: stars
# 客户端在启动时是否读取本地配置项(一个文件)来获取服务列表
naming-load-cache-at-start: false
# 命名空间ID,Nacos通过不同的命名空间来区分不同的环境,进行数据隔离,
namespace: dev
# 创建不同的集群
cluster-name: Cluster-A
# [注意]两个服务如果存在上下游调用关系,必须配置相同的group才能发起访问
group: group1
# 向注册中心注册服务,默认为true
# 如果只消费服务,不作为服务提供方,倒是可以设置成false,减少开销
register-enabled: true
2.4、spring-cloud-nacos-sample-consumer
这个模块是服务的消费端,就是远程服务调用者,先添加依赖:
<dependencies>
<dependency>
<groupId>com.jackie.nacos.test</groupId>
<artifactId>spring-cloud-nacos-sample-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2.4.1、创建openFeign接口
@FeignClient(value="nacos-sample-provider", path="/provider")
public interface HelloService {
//这里注解里参数,要和远程服务的一致
@GetMapping("/sayHello")
String sayHello(@RequestParam("name")String name);
}
解释一下@FeignClient(value=“nacos-sample-provider”, path=“/provider”),第一个value,指的是服务名称,第二个path是controller对应的@RequestMapping的路径。有个这些配置,发起远程调用,会按照这些参数,拼装一个完成的调用路径。
2.4.2、创建controller
@RestController
@Slf4j
public class HelloController {
@GetMapping("/sayHello")
public String sayHello(@RequestParam("name") String name) {
return helloService.sayHello(name);
}
//这个接口就是上面用openFeign注解的那个接口
@Autowired
private HelloService helloService;
}
2.4.3、创建springboot启动类
@SpringBootApplication
@EnableFeignClients(basePackages = {"com.jackie.nacos.test.consumer"})
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
System.out.println("启动成功了");
}
}
注意,多了一个@EnableFeignClients,包指向你接口所在的包路径。
2.4.4、application.yml
server:
port: 9091
spring:
application:
name: nacos-sample-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.3.99:8848,192.168.3.99:8948
service: nacos-sample-consumer
heart-beat-interval: 5000
heart-beat-timeout: 20000
# 元数据部分 - 可以自己随便定制
metadata:
mydata: stars
naming-load-cache-at-start: false
# 命名空间ID,Nacos通过不同的命名空间来区分不同的环境,进行数据隔离,
namespace: dev
# 创建不同的集群
cluster-name: Cluster-stars
# [注意]两个服务如果存在上下游调用关系,必须配置相同的group才能发起访问
group: group1
# 向注册中心注册服务,默认为true
# 如果只消费服务,不作为服务提供方,倒是可以设置成false,减少开销
register-enabled: true
logging:
level:
com.jackie.nacos.test.consumer.feign: debug
3、测试
启动nacos服务,启动上面provider和consumer服务,确保启动没有异常信息。用apifox发一个快捷请求,查看日志:
测试成功。
完整代码:github!