构建服务注册中心(Nacos)
什么是Nacos
Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
在接下里的教程中,将使用Nacos作为微服务架构中的注册中心(替代:eurekba、consul等传统方案)以及配置中心(spring cloud config)来使用。
安装Nacos
下载地址:https://github.com/alibaba/nacos/releases
本文版本:1.0.0
下载完成之后,解压。根据不同平台,执行不同命令,启动单机版Nacos服务:
- Windows:
cmd startup.cmd -m standalone
启动完成之后,访问:http://127.0.0.1:8848/nacos/
,可以进入Nacos的服务管理页面,具体如下;
默认用户名密码为:nacos
构建基于Nacos的注册中心
- 创建服务提供者nacos-provider工程,引入pom.xml依赖:
<?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.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lyh</groupId>
<artifactId>nacos-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.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>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.RELEASE</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>
- 创建应用主类,并实现一个HTTP接口:
package com.lyh.nacosprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@EnableDiscoveryClient
@SpringBootApplication
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
@RestController
static class TestController {
@GetMapping("/hello")
public String hello(@RequestParam String name) {
return "hello " + name;
}
}
}
- 在配置文件中配置服务名称和Nacos地址:
spring.application.name=nacos-provider
server.port=8001
spring.cloud.nacos.discovery.enabled=true
spring.cloud.nacos.discovery.register-enabled=true
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
- 启动应用我们可以访问Nacos的管理页面http://127.0.0.1:8848/nacos/来查看服务列表,此时可以看到如下内容:
说明我们的生产者工程注册成功。
服务消费者
接下来,实现一个应用来消费上面已经注册到Nacos的服务。
第一步:创建一个Spring Boot应用,命名为:alibaba-nacos-discovery-client-common
。
第二步:编辑pom.xml中的依赖内容,与上面服务提供者的一样即可。
第三步:创建应用主类,并实现一个HTTP接口,在该接口中调用服务提供方的接口。
package com.lyh.nacosconsumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping("/test")
public String test() {
// 通过spring cloud common中的负载均衡接口选取服务提供节点实现接口调用
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
String url = serviceInstance.getUri() + "/hello?name=" + "didi";
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject(url, String.class);
return "Invoke : " + url + ", return : " + result;
}
}
这里使用了Spring Cloud Common中的LoadBalancerClient
接口来挑选服务实例信息。然后从挑选出的实例信息中获取可访问的URI,拼接上服务提供方的接口规则来发起调用。
第四步:配置服务名称和Nacos地址,让服务消费者可以发现上面已经注册到Nacos的服务。
spring.application.name=nacos-consumer
server.port=8002
spring.cloud.nacos.discovery.enabled=true
spring.cloud.nacos.discovery.register-enabled=true
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
第五步:启动服务消费者,然后通过curl或者postman等工具发起访问,下面以postman为例:
localhost:9000/test
返回结果:hello didi,至此,基于nacos的基本注册中心搭建完成。