Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
项目:https://github.com/alibaba/nacos
单机方式安装:
下载地址:https://github.com/alibaba/nacos/releases/tag/1.3.0
下载完,解压:
进入到bin目录,然后运行startup.cmd (windows) ,可以正常启动的画面:
访问:http://localhost:8848/nacos/
说明成功。
这是使用了Nacos自带的derby数据库,下边改为使用mysql数据库,mysql版本要求:5.6.5以上。
先到数据库中建一个库:nacos_config(数据库名随便起也可以)
打开conf目录,找到一个 nacos-mysql.sql 的SQL文件,到新建的数据库里运行,建好表。
然后编辑conf目录中的配置文件:application.properties
#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=
重启:关掉之前运行的Nacos,重新执行bin目录中的startup.cmd
新建个命名空间:
新建一个配置项:在dev的命名空间中新建配置项:alibaba-nacos
数据库里保存好了,注册中心和配置中心搭建成功。
在springboot项目中使用
编辑配置文件:bootstrap.yml
配置中心和注册中心一起配置了
server:
port: 8301
tomcat:
uri-encoding: utf-8
spring:
application:
name: alibaba-nacos # 对应于配置项的Data ID
cloud:
#Nacos 的配置
nacos:
# 配置中心的配置
config:
# 配置中心的服务地址
server-addr: 127.0.0.1:8848
# 配置项的命名空间,如果不指定将会在public命名空间下查找配置项
namespace: 83162804-51ff-489b-90ef-fb85cd99b407
# 配置所属的分组,如果组名为:DEFAULT_GROUP,则可以省略此项的配置(namespace如果是按环境分[dev,prod],那group则可以是按项目名来定)
group: DEFAULT_GROUP
#group: goods # 假设本项目是一个商品服务,使用goods做为组名,可以切换下分组名测试看下效果
# 文件格式
file-extension: yaml
# 注册中心的配置
discovery:
# 注册中心的服务地址,因为与配置中心的相同所以使用变量引用配置中心的设置
server-addr: ${spring.cloud.nacos.config.server-addr}
# 指定服务要注册到哪个命名空间中去,不设置本项会注册到public中,多环境或版本时要注意这一项的设置
# 为了让配置,服务注册两者的命名空间相同这里用了一个变量,引用了配置的命名空间
namespace: ${spring.cloud.nacos.config.namespace}
# 指定服务要注册到哪个组中去,不设置本项会注册到默认的DEFAULT_GROUP,多项目时可以按项目名来定
# 为了让配置,服务注册两者的分组相同,这里用了一个变量,引用了配置的分组
group: ${spring.cloud.nacos.config.group}
配置的对应关系
新建一个控制器测试下配置:
package com.example.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
public class IndexController {
@Value("${server.port}")
String port;
@Value("${test:aa}")
private String test;
@RequestMapping("/test")
public String test() {
return "微服务端口 " + port + " : " + test; // 加下端口以示区分
}
}
启动,并访问:http://localhost:8301/test
输出的是“a”而不是默认的“aa”,说明配置生效。
改下Nacos中的配置并发布:
刷新 可以看到输出的改变。
看下服务列表,刚启动的服务也注册进来了:
改下分组名,重新启动下:
看下服务列表:
分组也换了。
改下端口再启动一个服务:
查看下详情:两个端口都在
使用OpenFeign调用
服务注册好了,就要有客户端来调用
新建客户端项目:(增加了OpenFeign的项)
配置: bootstrap.yml
server:
port: 8311
tomcat:
uri-encoding: utf-8
spring:
application:
name: alibaba-nacos-client # 对应于配置项的Data ID
cloud:
#Nacos 的配置要与服务提供者保持一致
nacos:
# 配置中心的配置
config:
server-addr: 127.0.0.1:8848
namespace: 83162804-51ff-489b-90ef-fb85cd99b407
group: goods
file-extension: yaml
# 注册中心的配置
discovery:
server-addr: ${spring.cloud.nacos.config.server-addr}
namespace: ${spring.cloud.nacos.config.namespace}
group: ${spring.cloud.nacos.config.group}
新建用于调用服务的接口,NacosService.java
package com.example.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(value = "alibaba-nacos")
public interface NacosService {
@GetMapping("/test")
String index();
}
新建controller:
package com.example.controller;
import com.example.service.NacosService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
@Autowired
NacosService nacosService;
@GetMapping("/index")
public String index(){
String result = nacosService.index();
return result;
}
}
启动两个服务端,再启动客户端。
访问下客户端:http://localhost:8311/index
微服务端口交替更换,说明注册中心的两个服务都可以使用。.
改下配置并发布:
服务端的配置也产生了相应的变化:
完毕。
Nacos如何搭建高可用集群?
- 复制conf目录下的cluster.conf.example 为 cluster.conf。
- 修改cluster.conf文件,将搭建集群的机器的IP和端口号写入这个文件。
- 将nacos复制到各机器,注意保持application.properties中数据库的配置必须是相同的。
- 分别启动各机器上的nacos。
- 将各机器使用负载开放出去,例如使用 nginx,阿里云的SLB。
参考:https://www.cnblogs.com/FlyAway2013/p/11201250.html(版本不同,将就看下)