上一节介绍Nacos的时候,我们通过nacos-client-demo这个项目里的两个接口互相调用,验证了通过使用Nacos注册中心的注册发现功能,在不指定ip和端口号的情况下,仅通过服务名称来进行服务的调用,这就是微服务的一个主要功能。不过呢,我们通过这种服务名成查找到服务的集合,又从集合里随机取出来一个实例,最后拿着实例对象取出来连接参数然后拼接连接串才完成的服务调用。这种方式非常的麻烦,仅仅一个调用就这么多步骤,既不优雅也不稳定,因此这一节我们使用openfeign这个工具来进行服务的调用。
在前几年的时候,springcloud一般都是使用feign作为标准组件,不过随着Netflix公司不再维护feign,openfeign社区接手了feign从而更名为了openfeign。我在前几年刚开始使用Springcloud的时候的组件和今天我再写教程时候的组件变化非常的大,在工作上还是不得不要多卷一些,让自己的知识库更加丰富。
1、我们新建一个项目openfeign-demo,把它也加入到Nacos中,通过两个项目互相调用去验证openfeign的功能。
2、pom文件中加入Nacos依赖和openfeign依赖。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
3、配置application.yml文件,添加各种Nacos配置,让openfeign-demo纳入到Nacos的注册发现中,端口号用8081防止跟nacos-client-demo冲突。
spring:
application:
name: open-feign-demo
cloud:
nacos:
server-addr: 192.168.3.54:80
username: nacos
password: nacos
discovery:
group: devops
namespace: sit
config:
namespace: sit
group: devops
config:
import: nacos:${spring.application.name}?refresh=true
server:
port: 8081
4、创建启动类,并且通过注解@EnableFeignClients开启openfeign。
package com.mj.openfeign;
import com.mj.openfeign.config.DefaultFeignConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients
@SpringBootApplication
public class OpenFeignDemoApplication {
public static void main(String[] args) {
SpringApplication.run(OpenFeignDemoApplication.class, args);
}
}
5、创建一个client,去调用nacos-client-demo当中的call接口。
package com.mj.openfeign.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient("nacos-client-demo")
public interface NacosClientDemoClient {
@GetMapping("/call")
String testCall();
}
通过注解@FeignClient("nacos-client-demo"),把这个client指向了nacos-client-demo这个项目,这个名称要与nacos中注册服务的名字是一致的;通过@GetMapping("/call")把方法指向了调用/call这个接口,我们发现这个注解太像接口上的注解了,所以Feign最大的功能就是把调用接口和实现接口的代码搞成一模一样的,这样我们写代码就太方便了。
6、写一个测试接口,调用一下试试吧。
package com.mj.openfeign.api;
import com.mj.openfeign.client.NacosClientDemoClient;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/")
@RequiredArgsConstructor
public class NacosClientController {
private final NacosClientDemoClient client;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String test() {
return client.testCall();
}
}
7、浏览器打开地址查看调用成果:http://127.0.0.1:8081/