Table of Contents
1.Nacos 介绍
官网:https://nacos.io/zh-cn/docs/quick-start.html
英文:https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html
中文:https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html
Nacos: Dynamic Naming and Contiguration Service
前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的s为Service.
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos = Eureka+Config +Bus
补充:Nacos也可以切换为 CP
AP模式:不需要存储服务级别的信息且服务实例是通过nacos-client注册
CP模式:需要在服务级别编辑或者存储配置信息
2.Nacos 安装
1.1.4zip
linux安装--> Nacos 集群部署
链接:https://pan.baidu.com/s/1yYGo5QbWy8hZEGUJCYpY-A
提取码:nuwk
由于git下载较慢,也可以自己打包(最新版本)
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
http://192.168.1.101:8848/nacos
账号:nacos 密码:nacos
3.Nacos 服务注册与发现
Nacos Discovery 适配了 Netflix Ribbon,可以使用 RestTemplate 或 OpenFeign 进行服务的调用。
1.提供者 alibaba-provider8901
pom
<dependencies>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.ak.demo</groupId>
<artifactId>api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
yml
server:
port: 8901
spring:
application:
name: alibaba-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
include: "*"
主启动
@EnableDiscoveryClient
@SpringBootApplication
public class AlibabaProvider8901 {
public static void main(String[] args) {
SpringApplication.run(AlibabaProvider8901.class, args);
}
}
业务
@RestController
public class EchoController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/echo")
public String echo() {
return "Hello Nacos Discovery: " + serverPort;
}
}
2.提供者 alibaba-provider8902
同8901
3.消费者 alibaba-consumer8903
pom、yml、主启动 参照上面
业务
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //开启负载均衡 注意,与自定义的互斥
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
@RestController
public class EchoController {
private final static String PAYMENT_URL = "http://alibaba-provider";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "consumer/echo")
public String echo() {
return restTemplate.getForObject(PAYMENT_URL + "/echo", String.class);
}
}
4.Nacos 配置中心
1.alibaba-config3377
pom
<dependencies>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.ak.demo</groupId>
<artifactId>api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
bootstrap.yml
server:
port: 3377
spring:
application:
name: alibaba-config
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos服务注册中心地址
config:
server-addr: localhost:8804 #nacos作为配置中心地址
file-extension: yaml #指定yaml格式配置,即3377服务到8848上读取类型为yaml的文件
application.yml
spring:
profiles:
active: dev #指定环境
2.DataId 格式
DataId 默认使用 `spring.application.name` 配置跟文件扩展名结合(配置格式默认使用 properties), GROUP 不配置默认使用 DEFAULT_GROUP。
当前项目的为:alibaba-config-dev.yaml
新增配置 http://localhost:8848/nacos
3.Group 配置
在没有明确指定 ${spring.cloud.nacos.config.group}
配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group=DEVELOP_GROUP
4.Namespace 配置
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定 ${spring.cloud.nacos.config.namespace}
配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring.cloud.nacos.config.namespace=5cd8fffa-3256-4373-9b12-3f4ed28f5f45
5.Nacos 持久化
在0.7版本之前,在单机模式时nacos使用嵌入式数据库(derby)实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,切换为mysql的操作步骤:
- 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://192.168.71.128:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
Caused by: java.lang.RuntimeException: Nacos Server did not start because dumpservice bean construction failure :
No DataSource set
at com.alibaba.nacos.config.server.service.dump.DumpService.init(DumpService.java:140)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
注意:nacos 1.3.1以后的版本才支持 mysql 8
6.Nacos 集群部署
1.jdk
2.下载安装
链接:https://pan.baidu.com/s/1yiVB71hJ70zMJFbphIXA4g
提取码:drqs
下载解压 unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
3.application.properties
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.71.128:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
4.单机启动测试
linux下启动单机: ./startup.sh -m standalone
默认启动为集群模式,查看../logs/nacos.log会有报错信息,启动参数standalone 单机模式
5. startup.sh 和 cluster.conf
由于在同一台服务器搭建集群,通过修改 startup.sh 和 cluster.conf ,启动三个不同的端口
- cluster.conf
cp cluster.conf.example cluster.conf
vim cluster.conf
#it is ip
#example
192.168.71.128:8841
192.168.71.128:8842
192.168.71.128:8843
- startup.sh
修改前:
修改后:
6. 启动及jvm优化
分别启动三个服务
sh startup.sh -p 8841
sh startup.sh -p 8842
sh startup.sh -p 8843
由于内存不足,优化JVM如下
修改startup.sh
前:
后:-Xms256m -Xmx256m -Xmn85m
修改后启动成功:
ps -ef |grep nacos |grep port
ps -ef |grep nacos |grep port|wc -l
web访问分别访问三个地址验证
http://192.168.71.128:8841/nacos
http://192.168.71.128:8842/nacos
http://192.168.71.128:8843/nacos
7. Nignx配置
upstream cluster{
server 192.168.71.128:8841;
server 192.168.71.128:8842;
server 192.168.71.128:8843;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
# root /usr/share/nginx/html;
# index index.html index.htm;
proxy_pass http://cluster;
}
}
#nginx
docker run -idt -e "TZ=Asia/Shanghai" --name nginx_nacos -v /root/docker/nginx_nacos/conf:/etc/nginx -v /root/docker/nginx_nacos/logs:/var/log/nginx -p 1111:80 --privileged=true --restart=always nginx
或者
另外要nginx监听端口改为 1111
./nginx -c /usr/local/nginx/conf/nqinx. conf
8. 测试
配置验证
服务验证