# SpringBoot 整合 Nacos 进行服务注册发现

我们首先看一下 nacos 的简单架构图:

参照上面的架构图,我们分别创建两个模块,分别是 cloud-producer-server(服务提供者)、cloud-consumer(服务消费者),职责如下:

cloud-producer-server:注册进入nacos-server,对外暴露
服务cloud-consumer:注册进入nacos-server,调用 cloud-producer-server 的服务

创建这两个模块前,我们先声明项目的版本信息:

<properties>
    <spring-boot.version>2.1.8.RELEASE</spring-boot.version>
    <spring-cloud.version>Greenwich</spring-cloud.version>
    <spring-cloud-alibaba.version>2.1.2.RELEASE</spring-cloud-alibaba.version>
</properties>
  
<!--  只声明依赖,不引入依赖 -->
<dependencyManagement>
    <dependencies>
        <!-- 声明springBoot版本 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- 声明springCloud版本 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- 声明 springCloud Alibaba 版本 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

# 1、创建服务提供者 cloud-producer-server:

(1)引入 maven 依赖:

<!-- 引入阿里的nacos作为服务注册中心 -->
	<dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
	</dependency>

如果爆红加入 <version>2.2.1.RELEASE</version>

(2)添加 nacos 相关的配置信息: 在 application.properties 配置文件指定服务名称、端口号、nacos-server 的地址信息,如下:

spring.application.name = cloud-producer-server
server.servlet.context-path = /${spring.application.name}
server.port=9000
# nacos注册中心配置
spring.cloud.nacos.discovery.server-addr = localhost:8848
spring.cloud.nacos.discovery.namespace = d3a1cdf5-10de-4b72-9449-38b5cbe5c0d3
spring.cloud.nacos.discovery.register-enabled = true

(3)开启服务注册发现的功能: 在主 Application 启动类加入 @EnableDiscoveryClient 注解开启服务注册发现的功能,如下:

/**
 * SpringBoot 启动类
 * @EnableDiscoveryClient 开启服务注册发现的功能
 */
@EnableDiscoveryClient
@SpringBootApplication
public class ProducerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProducerApplication.class, args);
    }
}

(4)实现个演示功能: cloud-producer-server 作为服务提供者注册到 nacos 中,肯定需要提供个服务来供消费者 cloud-consumer 调用,下面简单写一个演示接口:

@RestController
@RequestMapping(value = "/")
public class CloudController {
    @PostMapping("getSum")
    public String getSum(@RequestParam(value = "num1") Integer num1, @RequestParam(value = "num2") Integer num2) {
        return "success:两数求和结果=" + (num1 + num2);
    }
}

(5)启动项目: 启动项目之后,我们进入 nacos 控制台,在 nacos 的 “服务管理 -> 服务列表” 的 “d3a1cdf5-10de-4b72-9449-38b5cbe5c0d3” 空间中将会发现注册进入的
cloud-producer-server 这个服务,如下图:(图中的 dreamland 就是,名字是上面配置自定义的,命名空间也是自己配置然后生成的。)

# 2、创建服务消费者 cloud-consumer

服务消费者的创建步骤与服务提供者基本一致
(1)引入 maven 依赖:

<!-- 引入阿里的nacos作为服务注册中心 -->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

(2)添加 nacos 相关的配置信息:

spring.application.name = cloud-consumer
server.port=9001
  
# nacos注册中心配置
spring.cloud.nacos.discovery.server-addr = localhost:8848
spring.cloud.nacos.discovery.namespace = 91b5489b-d009-4725-86fa-534f760b4d04
spring.cloud.nacos.discovery.register-enabled = true

(3)开启服务注册发现的功能:

/**
 * SpringBoot 启动类
 * @EnableDiscoveryClient 开启服务注册发现的功能
 */
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication
{
	public static void main(String[] args)
	{
		SpringApplication.run(ConsumerApplication.class, args);
	}
}

(4)调用服务提供方的演示功能:
cloud-producer-server 服务提供方提供一个演示功能,那我们如何调用该功能呢?其实 Nacos 集成了 Ribbon(有关 Ribbon 的详细介绍请参考这篇文章:跳转
,因此我们便能使用 Ribbon 的负载均衡来调用服务,步骤如下:

① 创建 RestTemplate,使用 @LoadBalanced 注解标注开启负载均衡:

@Configuration
public class RestConfig
{
    /**
     * 创建 restTemplate 对象。
     * LoadBalanced 注解表示赋予 restTemplate 使用 Ribbon 的负载均衡的能力(一定要加上注解,否则无法远程调用)
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

② 通过 RestTemplate 请求远程服务地址并接收返回值

@RestController
@RequestMapping (value = "api/invoke")
public class InvokeController
{
    @Autowired
    private RestTemplate restTemplate;
 
    /**
     * 使用 RestTemplate 进行远程服务调用,并且使用 Ribbon 进行负载均衡
     */
    @ApiOperation (value = "RestTemplate", notes = "使用RestTemplate进行远程服务调用,并使用Ribbon进行负载均衡")
    @GetMapping ("getByRestTemplate")
    public String getByRestTemplate(Integer num1, Integer num2)
    {
        // 第一个 cloud-producer-server 代表在 nacos 注册中心中的服务名,第二个 cloud-producer-server 代表 contextPath 配置的项目路径
        String url = "http://cloud-producer-server/cloud-producer-server/getSum";
        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
        params.add("num1", num1);
        params.add("num2", num2);
        // 通过服务名的方式调用远程服务(非 ip 端口)
        return restTemplate.postForObject(url, params, String.class);
    }
}

(5)启动测试,查看 nacos 注册中心控制面板情况
启动成功后将会在 nacos 中的服务列表中看到 cloud-consumer,如下图:

那么接下来就测试下服务能否调的通?访问服务消费方的 api/invoke/getByRestTemplate 接口,可以看到请求结果如下:

# 3、以上就结束了,查看集群化部署可以查看下一篇