Nacos简介
Nacos是Dynamic Naming and Configuration Service
的首字母简称。它主要提供了服务注册发现和配置管理功能,不过我们目前只介绍服务的注册和发现。在这之前我们需要先配置好Nacos的服务环境。
资源下载
Nacos目前有两个大版本分别为1.x和2.x,不过官网说目前推荐使用Nacos2.x的版本,虽然我们目前工程中依赖的nacos client
版本为1.4,但是Nacos2.x支持该版本客户端,所以这里我选择了Nacos版本为2.1.2
。关于Nacos下载地址,我们可以通过github上的发行版本选择下载,地址如下:
https://github.com/alibaba/nacos/releases
安装和配置
安装比较简单,首先本地需要有JDK环境,不过相信看该教程的同学这个问题不是很大。加压安装包之后一共有三个文件夹:
-
bin
存放了启动脚本相关命令。 -
conf
配置文件目录 -
target
Nacos应用目录。
我这里是为了学习所以在同一台机器上安装三个节点的Nacos,实际生产环境需要单独安装。将解压文件复制三份,分别命名为nacos-8848
、nacos-8850
、nacos-8852
。
修改数据库配置
默认情况下,Nacos使用的derby
存储的相关数据信息,这里我们修改成Mysql
的方式。修改很简单,只需要修改conf/application.properties
文件即可,修改如下:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root
具体配置根据自己实际情况来填写。在修改完配置文件之后,需要初始化数据,这里我先在数据库中创建nacos
库,然后运行初始化脚本mysql-schema.sql
即可完成数据库初始化。
修改端口
我这里在一台机器上启动了三个节点,如果不修改端口会报端口冲突。所以还需要修改conf/application.properties
配置中如下:
server.port=端口
注意:我这里使用的端口分别为
8848
、8850
、8852
。Nacos通信除了使用配置的端口外,还需要使用其他三个端口,其分别为:
raft port:${server.port} – 1000
grpc port:${server.port} + 1000
grpc port for server:${server.port} + 1001
如果端口设置为
8848
、8849
、8850
最后会造成冲突。
集群配置
集群配置只需要修改conf/cluster.conf
配置文件即可。默认情况下,该文件没有,直接创建即可。我这里配置文件如下:
192.168.1.11:8848
192.168.1.11:8850
192.168.1.11:8852
注意:在本机上最好指定IP地址,不要使用
127.0.0.1
,使用该配置可能导致Nacos UI 界面显示的集群信息不正确。
启动
上面都改好之后,执行bin/startup.cmd
命令分别启动三个节点。我这里是Windows环境,如果你是Linux环境还请执行.sh
结尾的命令。
启动之后,输入http://ip:8848/nacos
即可打开登录页面,默认情况下,Nacos的登录名和密码都是nacos
。
服务注册
上面介绍了如何运行Nacos服务,现在我们来使用Nacos服务注册。创建子模块工程nacos-register
,其pom.xml依赖如下:
<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">
<parent>
<artifactId>spring-cloud-alibaba-demo</artifactId>
<groupId>com.zc</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-register</artifactId>
<packaging>jar</packaging>
<name>nacos-register</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
该配置文件的核心是添加spring-cloud-starter-alibaba-nacos-discovery
依赖。当项目构建成功之后,在application.yml
添加如下配置:
server:
port: 9001 # 服务端口
spring:
application:
name: nacos-register # 服务名称
cloud:
nacos:
discovery:
server-addr: 192.168.1.11:8848,192.168.1.11:8850,192.168.1.11:8852 # nacos地址
username: nacos # nacos用户名
password: nacos # nacos密码
最后不要忘了在启动类型增加@EnableDiscoveryClient
注解。为了等下测试服务发现,我这里还创建了一个测试接口,内容如下:
@RestController
public class HelloController {
@Value("${server.port}")
private Integer serverPort;
@GetMapping("hello")
public Object hello(){
return "Hello World! " + serverPort;
}
}
到此我们服务使用Nacos作为注册中心已经实现了,启动服务在Nacos的管理后台服务管理->服务列表
就能看到我们刚才创建的服务了。
服务发现
上面我们已经演示了服务的注册,接来下就是服务发现。重新创建子工程nacos-discovery
,该子项目和前面的nacos-register
依赖基本相同。对于pom文件内容这里就不再展示了,同时其application.yml
修改如下:
server:
port: 9002 # 服务端口
spring:
application:
name: nacos-discovery # 服务名称
cloud:
nacos:
discovery:
server-addr: 192.168.1.11:8848,192.168.1.11:8850,192.168.1.11:8852 # nacos地址
username: nacos # nacos用户名
password: nacos # nacos密码
这里基本上跟之前项目的配置保持一致,只是修改了服务端口和服务名称配置。接下来我们通过下面文件构建一个测试接口,示例代码如下:
@RestController
public class DiscoveryController {
@Resource
private DiscoveryClient discoveryClient;
@Resource
private RestTemplate restTemplate;
private SecureRandom random = new SecureRandom();
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@GetMapping("say_hello")
public Object sayHello(){
//获取服务实例列表
String serviceId = "nacos-register";
List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
if (instances.size() == 0){
throw new RuntimeException(String.format("没有可用的服务[%s]",serviceId));
}
//随机选取一个服务实例
int index = random.nextInt(instances.size());
ServiceInstance instance = instances.get(index);
//调用服务
String url = String.format("http://%s:%s/hello", instance.getHost(), instance.getPort());
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
return response.getBody();
}
}
这段代码简单的分析如下:
-
通过注入
DiscoveryClient
获取到实例,该实例提供了获取服务实例相关方法。同时我们这里还创建了一个RestTemplate
实例用来调用接口。 -
接下来就是
sayHello
方法的内容了:最后通过访问接口
http://localhost:9002/say_hello
将返回如下信息:Hello World! 9001
-
获取
nacos-register
服务实例。这里面获取到的是一个list列表,说明我们的服务可以提供多个不同实例。 -
随机获取一个实例。
-
获取实例相关信息,例如
IP
、PORT
等信息组装成实际服务调用地址。
相关资料
工程相关示例代码地址:https://github.com/I-Like-Pepsi/spring-cloud-alibaba-demo
原文始发于微信公众号(一只菜鸟程序员):Spring Cloud Alibaba版本教程-Nacos服务注册和发现
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/72794.html