结合之前写过的案例
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-providercloud: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: 9080spring:application:name: service-consumercloud: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 {@Resourceprivate RestTemplate restTemplate;@Resourceprivate 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 整合,实现了服务提供者与服务消费者之间的远程调用。这种架构模式不仅简化了服务调用的过程,还提高了系统的可扩展性和可维护性。