结合之前写过的案例
Springcloud Alibaba nacos简单使用
Springcloud 之 eureka注册中心加feign调用
在微服务架构中,服务注册与发现是一个关键组件。Nacos 是一个开源的服务注册与发现、配置管理平台,而 OpenFeign 是一个声明式的 Web 服务客户端,可以简化服务调用的过程。本文将介绍如何将 Nacos 与 OpenFeign 整合,实现远程服务调用。
1. 环境准备
在开始之前,请确保你已经安装并启动了 Nacos 服务器。你可以从 Nacos 官方网站 获取安装指南。
2. 创建服务提供者
首先,我们创建一个服务提供者,它将注册到 Nacos 并提供一个 RESTful API。
2.1 创建 Spring Boot 项目
创建一个新的 Spring Boot 项目,并添加以下依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
<!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--SpringBoot通用依赖模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.2 配置 Nacos
在 application.yml
文件中配置 Nacos 服务地址:
server:
port: 9001
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
2.3 定义服务接口
创建一个 RESTful 接口:
@RestController
public class ServiceProviderController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/service/provider/{id}")
public String getPayInfo(@PathVariable("id") Integer id) {
return "服务提供者,支付接口,支付金额为:" + id + "元,端口:" + serverPort;
}
}
2.4 启动类
创建一个启动类来启动服务提供者:
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderStater {
public static void main(String[] args) {
SpringApplication.run(ProviderStater.class, args);
}
}
3. 创建服务消费者
接下来,我们创建一个服务消费者,它将使用 OpenFeign 调用服务提供者的接口。
3.1 创建 Spring Boot 项目
创建一个新的 Spring Boot 项目,并添加以下依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
<!-- lookup parent from repository -->
</parent>
<dependencies>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
<!-- </dependency>-->
<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>
<!--SpringBoot通用依赖模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--SpringCloud依赖,一定要放到dependencyManagement中,起到管理版本的作用即可-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringCloudAlibaba依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.2 配置 Nacos
在 application.yml
文件中配置 Nacos 服务地址:
server:
port: 9080
spring:
application:
name: service-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
3.3 启用 Feign 客户端
在启动类上添加 @EnableFeignClients
注解:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerStarter {
public static void main(String[] args) {
SpringApplication.run(ConsumerStarter.class, args);
}
}
3.4 定义 Feign 客户端接口
创建一个接口,并使用 @FeignClient
注解来指定服务提供者的名称:
@FeignClient(name = "service-provider" ) // 指定提供者服务的名称)
public interface ProviderService {
@GetMapping("/service/provider/{id}")
String getPayInfo(@PathVariable("id") Integer id);
}
3.5 使用 Feign 客户端
在控制器中注入并使用 Feign 客户端:注: 下面主要查看 paymentInfo2方法代码即可;
@RestController
public class ConsumerController {
@Resource
private RestTemplate restTemplate;
@Resource
private ProviderService providerService;
@GetMapping("/consumer/{id}")
public String paymentInfo(@PathVariable("id") Integer id) {
String result = restTemplate.getForObject("http://service-provider" + "/service/provider/" + id, String.class);
return result;
}
@GetMapping("/consumer2/{id}")
public String paymentInfo2(@PathVariable("id") Integer id) {
return providerService.getPayInfo(id);
}
}
下面是方法 paymentInfo 使用的RestTemplate配置类
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced //赋予RestTemplate负载均衡的能力
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
项目主要结构如下:
4. 测试
首先保证nacos服务已启动,接着启动服务提供者和服务消费者,
然后访问服务消费者的接口,例如 localhost:9080/consumer2/10
返回结果如下:
总结
通过以上步骤,我们成功地将 Nacos 与 OpenFeign 整合,实现了服务提供者与服务消费者之间的远程调用。这种架构模式不仅简化了服务调用的过程,还提高了系统的可扩展性和可维护性。