本文使用 SpringCloud 结合 Nacos 服务发现, Feign 远程调用做一个简单的 Demo.
1 Nacos
关于 Nacos 之前写了两篇文章关于 SpringBoot 对它的使用, 感兴趣可以查看一下.
《SpringBoot 使用 Nacos 配置中心》 https://www.dalaoyang.cn/article/93
《SpringBoot 使用 Nacos 服务发现》 https://www.dalaoyang.cn/article/94
在 SpringBoot 使用的时候, 需要自行去向 Nacos 服务注册自己的服务, Nacos 也提供了 SpringCloud 服务发现的依赖, 本文结合 spring-cloud-starter-alibaba-nacos-discovery 进行使用介绍.
本文使用版本为:
- SpringCloud Finchley.SR2
- SpringBoot 2.0.3.RELEASE
- spring-cloud-starter-alibaba-nacos-discovery 0.2.1.RELEASE
- spring-cloud-starter-openfeign 2.0.0.RELEASE
2. 本文场景
两个服务, 如下:
springcloud-nacos-discovery-provider: 端口号 10000, 服务提供者.
springcloud-nacos-discovery-consumer: 端口号 10001, 服务消费者.
原理很简单, 浏览器访问消费者, 消费者调用服务提供者.
3. 服务提供者
3.1 依赖配置
创建一个项目, 项目中加入 SpringCloud-Nacos 依赖, 完整 pom 如下所示.
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.3.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <groupId>com.dalaoyang</groupId>
- <artifactId>springcloud_nacos_discovery_provider</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <name>springcloud_nacos_discory_provider</name>
- <description>springcloud_nacos_discovery_provider</description>
- <properties>
- <java.version>1.8</java.version>
- <spring-cloud.version>Finchley.SR2</spring-cloud.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- <version>0.2.1.RELEASE</version>
- </dependency>
- </dependencies>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
3.2 启动类
在启动类加入 @SpringBootApplication 注解, 完整启动类代码如下所示.
- package com.dalaoyang;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
- @SpringBootApplication
- @EnableDiscoveryClient
- public class SpringcloudNacosDiscoveryProviderApplication {
- public static void main(String[] args) {
- SpringApplication.run(SpringcloudNacosDiscoveryProviderApplication.class, args);
- }
- }
3.3 配置文件
配置文件中配置 Nacos 服务地址, 当前服务名, 这里需要注意一点, 使用 Ribbon 负载均衡的时候服务名中不能使用下划线, 不然会找不到服务.
配置文件如下所示.
- server.port=10000
- spring.application.name=springcloud-nacos-discovery-provider
- spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3.4 提供服务
创建一个 Controller, 提供一个方法进行测试, 如下所示.
- package com.dalaoyang.controller;
- import org.springframework.Web.bind.annotation.*;
- /**
- * @author yangyang
- * @date 2019/2/4
- */
- @RestController
- public class TestController {
- @GetMapping("/test/{string}")
- public String test(@PathVariable String string) {
- return "Hello Nacos :" + string;
- }
- }
4 服务消费者
4.1 依赖配置
与服务提供者类似, 在服务消费者加入 SpringCloud-Nacos 依赖和 OpenFeign 依赖, 完整 pom 入夏所示.
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.3.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <groupId>com.dalaoyang</groupId>
- <artifactId>springcloud_nacos_discovery_consumer</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <name>springcloud_nacos_discovery_consumer</name>
- <description>springcloud_nacos_discovery_consumer</description>
- <properties>
- <java.version>1.8</java.version>
- <spring-cloud.version>Finchley.SR2</spring-cloud.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-openfeign</artifactId>
- <version>2.0.0.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- <version>0.2.1.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
4.2 启动类
在启动类加入注解 @EnableDiscoveryClient 并且开启负载均衡, 如下所示.
- package com.dalaoyang;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
- import org.springframework.cloud.client.loadbalancer.LoadBalanced;
- import org.springframework.context.annotation.Bean;
- import org.springframework.Web.client.RestTemplate;
- @SpringBootApplication
- @EnableDiscoveryClient
- public class SpringcloudNacosDiscoveryConsumerApplication {
- public static void main(String[] args) {
- SpringApplication.run(SpringcloudNacosDiscoveryConsumerApplication.class, args);
- }
- @LoadBalanced
- @Bean
- public RestTemplate restTemplate() {
- return new RestTemplate();
- }
- }
4.3 配置文件
配置文件与提供者一致, 只是服务名不同, 如下所示.
- server.port=10001
- spring.application.name=springcloud-nacos-discovery-consumer
- spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
4.4 创建服务调用
创建一个 Controller 进行调用服务, 如下所示.
- package com.dalaoyang.controller;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.Web.bind.annotation.GetMapping;
- import org.springframework.Web.bind.annotation.PathVariable;
- import org.springframework.Web.bind.annotation.RestController;
- import org.springframework.Web.client.RestTemplate;
- /**
- * @author yangyang
- * @date 2019/2/4
- */
- @RestController
- public class TestConrtroller {
- @Autowired
- private RestTemplate restTemplate;
- @GetMapping("test/{string}")
- public String test(@PathVariable String string) {
- return restTemplate.getForObject("http://springcloud-nacos-discovery-provider/test/" + string, String.class);
- }
- }
5 测试
分别启动两个服务, 查看 Nacos 管理页面, 如图所示.
点击详情可以查看服务的详细信息, 如端口号, 权重等, 如图所示.
接下俩在浏览器访问 http://localhost:10001/test/dalaoyang , 远程调用成功.
6. 源码
服务提供者:
服务消费者:
来源: https://juejin.im/post/5c57e35b6fb9a049c30bb06f