nacos
来源
整理自B站尚硅谷
概念
官网地址,发现、配置和管理微服务、Nacos 提供了一组简单易用的特性集,快速实现动态服务发现、服务配置、服务元数据及流量管理、Nacos: Dynamic Naming and Configuration Service、替代Eureka做服务注册中心、替代Config做服务配置中心。
下载地址:https://github.com/alibaba/nacos/releases/
来到bin目录下运行startup.cmd,如果报错,nacos默认是以集群环境启动的,使用命令以单体运行:startup.cmd -m standalone,运行成功后访问nacos的控制台http://localhost:8848/nacos,账号密码默认都是nacos,来到nacos的控制台。
案例
新建module cloudalibaba-provider-payment9001
父工程pom
<dependencyManagement>
<dependencies>
<dependency>
<groupId> com.alibaba.cloud </groupId>
<artifactId> spring-cloud-alibaba-dependencies </artifactId>
<version> 2.1.0.RELEASE </version>
<type> pom </type>
<scope> import </scope>
</dependency>
</dependencies>
</dependencyManagement>
9001pom
<dependencies> <!--SpringCloud ailibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- SpringBoot整合Web组件 --> <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> </dependencies>
yml
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址 management: endpoints: web: exposure: include: '*'
主启动类
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class PaymentMain9001 { public static void main(String[] args) { SpringApplication.run(PaymentMain9001.class, args); } }
controller
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos")
public String getPayment()
{
return "registry 1, serverPort: "+ serverPort;
}
}
测试
http://localhost:9001/payment/nacos
这样nacos服务注册和服务发现都好了。
负载均衡
根据cloudalibaba-provider-payment9001创建cloudalibaba-provider-payment9002,基本上一模一样
nacos整合了ribbo,支持负载均衡
创建服务消费者cloudalibaba-consumer-nacos-order83
pom
<dependencies> <!--SpringCloud ailibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- SpringBoot整合Web组件 --> <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> </dependencies>
yml
server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者) service-url: nacos-user-service: http://nacos-payment-provider
主启动类
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class OrderNacosMain83 { public static void main(String[] args) { SpringApplication.run(OrderNacosMain83.class,args); } }
配置
import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class ApplicationContextBean { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
controller
import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @RestController public class OrderNacosController { @Resource private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String serverURL; @GetMapping("/consumer/payment/nacos") public String paymentInfo() { return restTemplate.getForObject(serverURL+"/payment/nacos",String.class); } }
测试
http://localhost:83/consumer/payment/nacos,负载均衡实现了,nacos控制台也正常
特点
Nacos 支持AP和CP模式的切换,命名空间类似于java的包,
自动刷新案例
新建module cloudalibaba-config-nacos-client3377
pom
<dependencies> <!--nacos-config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--nacos-discovery--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--web + actuator--> <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> </dependencies>
yml
Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
bootstrap.yml
# nacos配置 server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 config: server-addr: localhost:8848 #Nacos作为配置中心地址 file-extension: yaml #指定yaml格式的配置
application.yml
spring:
profiles:
active: dev # 表示开发环境
主启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
controller
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
也就是dataId=服务名称-项目环境.文件格式
创建一个配置
启动3377的服务,测试:http://localhost:3377/config/info
修改配置文件,再次调用查看配置的接口,http://localhost:3377/config/info,配置已经刷新了
分类配置
类似于java的包名和类名
新建一个命名空间
切换命名空间创建配置文件
修改bootstrap.yml
测试:http://localhost:3377/config/info
集群模式部署
这里在cenos 7环境下使用一个nginx,三个nacos,一个mysql模拟
mysql配置
安装好nacos后,登录进去mysql,create database nacos_config;
use nacos_config;
source nacos-mysql.sql;
nacos配置
修改conf下的application.properties
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=密码
修改cluster.conf
使用hostname -I获得ip,i一定是大写,小写可能是127.0.0.1,假设我查出来的是192.168.111.130
cp cluster.conf.example cluster.conf
vi cluster.conf
添加如下内容
192.168.111.130:3333
192.168.111.130:4444
192.168.111.130:5555
前面的ip使用hostname -I查出来的,按i进入编译,esc退出编译,:wq!进行保存。
修改startup.sh
[root@localhost bin]#cp startup.sh start.sh.init
[root@localhost bin]#vim startup.sh
修改前
修改后
启动之前先启动mysql服务
service mysqld start
在nacos的bin目录下的执行:
./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555
windows浏览器测试:http://192.168.111.130:3333/nacos/#/login,如果能出现登录页面,说明配置成功
输入 ps -ef|grep nacos|grep -v grep|wc -l 查看,如果不是3,可能是jvm内存不够,修改nacos的配置
修改nginx.conf
进入到nginx的conf目录
[root@localhost conf]# cp nginx.conf nginx.conf.bk
[root@localhost conf]# vim nginx.conf
upstream cluster{ server 127.0.0.1:3333; server 127.0.0.1:4444; server 127.0.0.1:5555; }
server { listen 1111; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { #root html; #index index.html index.htm; proxy_pass http://cluster; }
进入到nginx的sbin目录
./nginx
访问192.168.111.130/nacos,注意,这里的ip是用hostname -I查出来的
修改9002的配置文件