- 官方文档:
- Nacos服务注册与配置中心
- Nacos简介
- Nacos安装并运行
- 服务注册
- 消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者
- 选择使用何种模式?(Nacos可以切换AP,CP两种模式)
- 配置中心
- ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
- 三个nacos部署在同一台服务器上,服务器ip:192.168.1.131,将8846、8847、8848三个端口分别映射到三个docker容器,自己根据实际情况自行调整,修改jvm参数大小
- 创建三个nacos容器
官方文档:
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
Nacos服务注册与配置中心
Nacos简介
为什么叫Nacos
前四个字母分别为Naming,Configuration的前两个字母,最后s为Service。
是什么?
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
注册中心+配置中心的组合。即 Nacos=Eureka+Config+Bus.
能干啥?
代替Eureka做服务注册中心
代替Config做服务配置中心
官网: https://naocs.io
Nacos安装并运行
- 下载地址 https://github.com/alibaba/nacos/releases/tag/1.3.2
- 运行解压后bin文件夹下startup.cmd
startup.cmd -m standalone
访问:http://localhost:8848/nacos 默认用户名密码:nacos
服务注册
将服务提供者9001、9002和消费者Order83注册进Nacos
服务提供者9001和9002
pom
<!-- SpringCloud ailibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
父pom 配置alibaba-nacos版本号
<dependencyManagement> <dependencies> <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>
yaml
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: 127.0.0.1:8848 management: endpoints: web: exposure: include: "*"
主启动
@SpringBootApplication @EnableDiscoveryClient public class PaymentMain9001 { public static void main(String[] args) { SpringApplication.run(PaymentMain9001.class, args); } }
controller
@RestController public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping(value = "/payment/nacso/{id}") public String getpayment(@PathVariable("id") Integer id) { return "Hello Nacos Discovery " + id+"\t port:"+serverPort; } }
服务消费者Order83
pom:同上9001和9002
- yaml
```yaml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery: server-addr: 127.0.0.1:8848
消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者
service-url: nacos-user-service: http://nacos-payment-provider
- Controller
```java
@RestController
@Slf4j
public class OrderNacosController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}") //消费者地址
private String serverURL;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") long id){
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
Config
@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
测试
结论: Nacos集成Rabbon,即自带负载均衡。
选择使用何种模式?(Nacos可以切换AP,CP两种模式)
CAP: 强一致性、高可用性、分区容错性如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并且能够保持心跳,那么就选择AP模式。
- 如果需要在服务级别编辑或者存储配置信息,那么CP是必须的,K8S服务和DBS服务则更适用于CP模式。
Nacos切换命令:curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switcches?entry=serverMode$value=CP'
配置中心
创建微服务CloudAlibaba-config-nacos-client3377
POM:
<!-- nacos config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- SpringCloud ailibaba nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
bootstarp.yml ```yaml server: port: 3377 spring: application: name: nacos-config-client cloud: nacos:
discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: yaml #指定yml格式
${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
- Application.yml
```yaml
spring:
profiles:
active: dev #开发环境
Controller类 添加@RefreshScope开启动态刷新配置
@RestController @RefreshScope //支持Nacos的动态刷新功能 public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo(){ return configInfo; } }
启动类:
@SpringBootApplication @EnableDiscoveryClient public class NacosConfigClientMain3377 { public static void main(String[] args) { SpringApplication.run(NacosConfigClientMain3377.class,args); } }
注:
获取失败重启Nacos
Nacos支持动态刷新,不用像bus一样需要运维人员post刷新。Nacos分类配置
问题:
实际开发中,通常会有dev、test、prod等环境,如何保证指定环境启动时服务器能够正确读取到Nacos中相应的配置文件呢?
Namespace+Group+Data ID三者的关系,为什么这么设计。
DataID方案:
- 指定spirng.profile.active和配置文件的DataID来使不同环境下读取不同的配置。
- 默认空间+默认分组+新建dev和test两个DataID.
- 通过spring.profile.ativiti属性就能进行多环境下配置文件的读取。 配什么就加载什么
- Group方案:
- 通过Group实现环境区分,新建Group
- 在nacos图形界面控制台上新建文件DataID
- 在bootstarp中config下增加一条group的配置即可。可配置为DEV_GROUP或TEST_GROUP
- Namespace方案
- Nacos自带默认是嵌入式数据库derby
Derby到mysql切换配置步骤
- 运行conf下的nacos-mysql.sql文件。
- 修改conf下application.properties文件
1.安装数据库,版本要求:5.6.5+ 2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql 3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。 spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=root
使用Docker部署Nacos集群
环境配置
Docker version 1.13.1
Nacos version 1.2.1
Mysql version 5.7
Nginx version lastest镜像拉取
Nacos:docker pull nacos/nacos-server
Nginx:docker pull nginx
Mysql:docker pull mysql:5.7
容器启动
Mysql启动:docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql
Nacos启动:
创建挂载文件路径
mkdir -p /usr/local/nacos/logs
mkdir -p /usr/etc/nacos/conf
- 复制nacos配置目录到宿主机(或从其他地方复制需要application.properties、cluster.conf)
docker cp 18fa206c4883:/home/nacos/conf /usr/etc/nacos/conf
三个nacos部署在同一台服务器上,服务器ip:192.168.1.131,将8846、8847、8848三个端口分别映射到三个docker容器,自己根据实际情况自行调整,修改jvm参数大小
```java创建三个nacos容器
docker run -d \ -e PREFER_HOST_MODE=hostname \ -e MODE=cluster \ -e NACOS_SERVER_PORT=8848 \ -e NACOS_SERVERS=”192.168.1.131:8846 192.168.1.131:8847 192.168.1.131:8848” \ -e SPRING_DATASOURCE_PLATFORM=mysql\ -e MYSQL_SERVICE_HOST=192.168.1.131\ -e MYSQL_SERVICE_PORT=3306\ -e MYSQL_SERVICE_USER=root\ -e MYSQL_SERVICE_PASSWORD=123456\ -e MYSQL_SERVICE_DB_NAME=nacos_config\ -e NACOS_SERVER_IP=192.168.1.131 \ -e JVM_XMS=256m -e JVM_XMX=512m \ -v /usr/local/nacos/logs1:/home/nacos/logs \ -v /usr/etc/nacos/conf:/home/nacos/conf \ -p 8848:8848 \ nacos/nacos-server:1.2.1
docker run -d \ -e PREFER_HOST_MODE=hostname \ -e MODE=cluster \ -e NACOS_SERVER_PORT=8847 \ -e NACOS_SERVERS=”192.168.1.131:8846 192.168.1.131:8847 192.168.1.131:8848” \ -e SPRING_DATASOURCE_PLATFORM=mysql\ -e MYSQL_SERVICE_HOST=192.168.1.131\ -e MYSQL_SERVICE_PORT=3306\ -e MYSQL_SERVICE_USER=root\ -e MYSQL_SERVICE_PASSWORD=123456\ -e MYSQL_SERVICE_DB_NAME=nacos_config\ -e NACOS_SERVER_IP=192.168.1.131 \ -e JVM_XMS=256m -e JVM_XMX=512m \ -v /usr/local/nacos/logs1:/home/nacos/logs \ -v /usr/etc/nacos/conf:/home/nacos/conf \ -p 8847:8847 \ nacos/nacos-server:1.2.1
docker run -d \ -e PREFER_HOST_MODE=hostname \ -e MODE=cluster \ -e NACOS_SERVER_PORT=8846 \ -e NACOS_SERVERS=”192.168.1.131:8846 192.168.1.131:8847 192.168.1.131:8848” \ -e SPRING_DATASOURCE_PLATFORM=mysql\ -e MYSQL_SERVICE_HOST=192.168.1.131\ -e MYSQL_SERVICE_PORT=3306\ -e MYSQL_SERVICE_USER=root\ -e MYSQL_SERVICE_PASSWORD=123456\ -e MYSQL_SERVICE_DB_NAME=nacos_config\ -e NACOS_SERVER_IP=192.168.1.131 \ -e JVM_XMS=256m -e JVM_XMX=512m \ -v /usr/local/nacos/logs1:/home/nacos/logs \ -v /usr/etc/nacos/conf:/home/nacos/conf \ -p 8846:8846 \ nacos/nacos-server:1.2.1
- 访问 http://119.3.160.59:8846/nacos
<a name="jT2mE"></a>
#### Nginx配置nacos的统一入口
[https://blog.csdn.net/BDawn/article/details/106234675](https://blog.csdn.net/BDawn/article/details/106234675)<br />**docker启动nginx**<br />docker run --name my-nginx -v /root/docker/nginx/nginx.conf:/etc/nginx.nginx.conf:ro -p 8080:8080 -d nginx<br />-v /root/docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro :挂载nginx中的配置文件。<br />-p 8080:8080 :映射8080端口<br />**nginx主要配置信息:**
upstream cluster{ server 192.168.1.131:8846; server 192.168.1.131:8847; server 192.168.1.131:8848; } server { listen 8080; server_name localhost;
location / {
proxy_pass http://cluster;//转发到cluster上的地址
}
}
```
配置修改之后注意重启nginx
全部配置成功就可以通过8080端口访问nacos http://xxxx:8080