1.Nacos 简介
为什么叫Nacos
前四个字母为Nameing和Configuration的前两个字母,最后的s为Service。
是什么?
Nacos
(Nacos:Dynamic Naming and Configuration Service)是一个更易于构建原生应用的动态服务发现、配置管理和服务管理平台。Nacos就是注册中心+配置中心的组合,它等价于Eureka
+Config
+Bus
。
能干嘛?
它能替代Eureka
做服务中心,替代Config
做微服务配置中心。
2.安装Nacos
安装之前首先下载Nacos
,下载地址https://github.com/alibaba/nacos/releases 。这里注意如果是Windows(有Java+MySQL8.0以下版本环境)可以下载完开箱即用。Windows启动如下命令。
startup.cmd -m standalone
如果你的MySQL
版本是8.x,使用方法如下:
1.下载源码git clone https://github.com/alibaba/nacos.git
2.用Idea打开项目,修改pom.xml
里面的MySQL
版本
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!-- <version>5.1.34</version> -->
<version>8.0.18</version>
</dependency>
3.修改MySQL驱动 com/alibaba/nacos/naming/healthcheck/MysqlHealthCheckProcessor.java
// import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;原数据在24行
//将其替换
import com.mysql.cj.jdbc.MysqlDataSource;
4.重新编译
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
5.将编译好的文件复制到你所要存放的nacos的地方:
cp distribution xxx
mv distribution nacos
这时候就相当于你下载了一个支持MySQL8.x
的Nacos
。你可以用相对应得命令启动。
已经编译好下载地址:https://pan.baidu.com/s/1xVeg0t98BKlUbgvQMzTBxA 提取码:vssl
如果是Linux/Mac
,启动命令如下。
sh startup.sh -m standalone
启动之后可以访问Nacos
客户端,默认用户名密码都是nacos
3.Nacos做注册中心
服务提供方
1.创建springboot项目并添加依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version>
</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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<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>
2.配置文件配置
server.port=9001
spring.application.name=nacos-provider
# nacos注册中心地址
spring.cloud.nacos.discovery.server-addr=localhost:8848
3.启动文件添加注解
@EnableDiscoveryClient
@SpringBootApplication
public class AlibabaProviderApplication {
public static void main(String[] args) {
SpringApplication.run(AlibabaProviderApplication.class, args);
}
}
4.提供消费接口
@RestController
public class HelloController {
@Value("${server.port}")
String serverPort;
@GetMapping("/provider/hello")
public String hello(){
return "nacos1 hello"+serverPort;
}
}
5.再创建一个项目如上配置用于后面做负载均衡测试,或者如下图直接拷贝虚拟端口映射
6.启动项目测试提供的接口:http://localhost:9001/provider/hello
服务消费方
1.创建springboot项目并添加依赖,这里依赖与服务提供方相同
2.配置application.properties
server.port=9011
spring.application.name=nacos-consumer
spring.cloud.nacos.discovery.server-addr=localhost:8848
#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url.nacos-user-service=http://nacos-provider
3.配置注册RestTemplate
进行服务间接口调用
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
4.调用服务提供方接口
@RestController
public class OrderNacosController {
@Autowired
RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverUrl;
@GetMapping("/consumer/hello")
public String hello(){
return restTemplate.getForObject(serverUrl+"/provider/hello",String.class);
}
}
5.启动项目测试:http://localhost:9011/consumer/hello
各个服务注册中心比较(Nacos CA/AP都支持):
服务出现故障的时候,CP是直接拒绝服务的,它保证一致性,AP则是保证可用性,允许一段时间出现数据不一致,但最终会趋向一致。
4.Nacos做配置中心
1.创建springboot项目并引入依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<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-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<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>
2.对两个配置文件进行配置bootstrap.properties
和application.properties
,boostrap加载优先级高于application
bootstrap.properties:
server.port=3377
spring.application.name=nacos-config-client
# 注册中心
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 配置中心
spring.cloud.nacos.config.server-addr=localhost:8848
# 这里指定的文件格式需要和nacos上新建的配置文件后缀相同,否则读不到
spring.cloud.nacos.config.file-extension=properties
# 分组配置
#spring.cloud.nacos.config.group=DEV_GROUP
# 命名空间配置
# spring.cloud.nacos.config.namespace=782bd58a-0902-4ac4-bef3-f145806eff3c
# 配置文件名称拼接公式,拼接后与nacos中相对于
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
详细说明参考https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
application.properties配置:
spring.profiles.active=dev
3.定义接口获取配置信息
@RestController
@RefreshScope //支持nacos动态刷新
public class ConfigController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return configInfo;
}
}
4.定义配置信息
上面配置都是默认分组,我们也可以自定义分组()和命名空间(namespace)。
5.配置好之后启动调用接口获取配置信息http://localhost:3377/config/info