一、安装使用
1、下载
下载源码: 这是源码!这是源码!
下载客户端Nacos: 这个才是nacos安装包
点击上面的版本,下拉到后面就可以看到安装包
2、安装
将nacos-server-2.0.3.zip解压。
进入bin目录:
上面这种方式可能会报错!!!
我们使用cmd进入终端使用命令进行启动:
#启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
如果中途卡住可以按回车
成功启动:
访问:http://localhost:8848/nacos/
- linux启动
# 进入bin目录下
sh startup.sh -m standalone
登录账号密码,默认都为nacos
到此nacos安装完毕。
二、nacos入门
(一)生产者
1、导入pom依赖
注意版本问题,否则会出错
可以参考:spring cloud alibaba 版本说明
spring boot与spring clud的版本关系
spring cloud与spring cloud alibaba
在我们项目顶层(root、父项目)的POM文件中,我们会看到dependencyManagement元素。通过它元素来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。
- 父pom依赖
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<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>
- nacos子工程依赖
注意:创建普通的maven项目,不要直接创建spring boot项目
<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>
2、改yml配置
server.port=8001
spring.application.name=service-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3、开启服务注册与发现功能
package com.lihua;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* 主启动类
* <b>@EnableDiscoveryClient:开启服务注册与发现功能</b>
* @author 15594
*/
@SpringBootApplication
@EnableDiscoveryClient
public class Provider8001 {
public static void main(String[] args) {
SpringApplication.run(Provider8001.class,args);
}
}
4、测试类
package com.lihua.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 模拟生产者(服务提供者)
* @author 15594
*/
@RestController
public class Provider8001Controller {
@RequestMapping("/provider")
public String provider8001(){
System.out.println("调用业务层成功");
return "生产者提供服务";
}
}
(二)消费者
1、导入pom依赖
<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>
<!--这个可以不导入,因为nacos-discovery中继承了ribbon-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>-->
<!-- </dependency>-->
</dependencies>
2、改yml配置
server.port=81
spring.application.name=service-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#这个为自定义属性,指定需要调用的服务
service-url.nacos-user-service=http://service-provider
3、开启服务注册与发现
package com.lihua;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* 主启动类
* @author 15594
*/
@SpringBootApplication
//开启服务注册与发现
@EnableDiscoveryClient
public class Consumer81 {
public static void main(String[] args) {
SpringApplication.run(Consumer81.class,args);
}
}
4、配置负载均衡
package com.lihua.config;
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;
/**
* 负载均衡
* @author 15594
*/
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced //开启负载均衡,让消费者知道调用注册中心的那个服务(这个服务的功能一致,但在不同的服务器上)
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
5、测试类
package com.lihua.consumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* 消费者(调用微服务)
* @author 15594
*/
@RestController
public class Consumer81Controller {
@Autowired
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String PAYMENT_URL;
@RequestMapping("/consumer81")
public String consumer81(){
String provider = restTemplate.getForObject(PAYMENT_URL + "/provider", String.class);
return "消费者81,消费:"+provider;
}
}
注意:为了方便测试负载均衡,可以在新建一个生产者8002。
分别启动: 消费81、生产者8001、生产者8002
nacos注册中心:
测试:
(三)配置中心
1、导入pom依赖
在之前的基础上增加一个依赖
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、改yml配置
新建一个配置文件:bootstrap.properties(名称必须为bootstrap,扩展名可以是yml、properties)
在bootstrap.properties中配置nacos config相关的配置,其他配置可以放在application.properties(重要!!!)
- application.properties
server.port=8001
spring.application.name=service-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
- bootstrap.properties(这里面的配置,后面详细讲) 。推荐先看后面的详解,再回来改yml配置
nacos 配置中心的配置可以分为两种: 一种是根据公式进行配置,一种是自定义的方式配置。
公式的方式
:
# nacos配置
server:
port: 8001
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
group: Test_GROUP # 在nacos server用户界面中获取
namespace: aedc232d-98ac-4fef-ac63-46b048228751 # 在nacos server用户界面中获取, 默认的命名空间是pubic(pubic没有 命名空间id)
# 这个公式用来确定 Data ID的值
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 根据application、bootstrap 着两个配置文件的内容得:
# spring.application.name = nacos-config-client
# spring.profile.active = dev
# spring.cloud.nacos.config.file-extension = yaml
# data id = nacos-config-client-dev.yaml
自定义的方式
:
# 配置中心
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 指定命名空间
spring.cloud.nacos.config.namespace=d597b12a-a05a-4d39-9145-d93f8e482024
# 自定义data id和分组(data id必须带扩展名,名字随意。不指定分组默认为:DEFAULT_GROUP)
spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common02.properties
spring.cloud.nacos.config.ext-config[0].group=GLOBALE_GROUP
# 是否支持动态刷新,当自定义data id 时默认不支持
spring.cloud.nacos.config.ext-config[0].refresh=true
3、主启动类不用变
/**
* 主启动类
* <b>@EnableDiscoveryClient:开启服务注册与发现功能</b>
*
* @author 15594
*/
@SpringBootApplication
@EnableDiscoveryClient
public class Provider8002 {
public static void main(String[] args) {
SpringApplication.run(Provider8002.class,args);
}
}
4、核心代码
核心注解:@RefreshScope 。有了这个注解才能使用远程动态刷新配置。
package lihua.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;
/**
* 配置中心测试
*
* // @RefreshScope 支持nacos的动态刷新功能 ,只要绑定了配置中心的配置文件,就会跟随配置中心的配置文件改变而改变
* @author 15594
*/
@RestController
@RefreshScope
public class ConfigClientController {
/**
* 这个属性从nacos配置中心绑定的配置文件中注入。
* 这样就能实现远程动态刷新配置
* */
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return "8002:"+configInfo;
}
}
5、测试
浏览器打开:http://localhost:8001/config/info
当修改远程配置文件的内容:
再次访问,发现@Value("${config.info}")注入的配置已经发生变化:
6、bootstrap.properties中nacos config配置
我将nacos config的配置分为两大类。
- 一种是根据公式创建远程配置文件。
公式:${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
- 一种是自定义创建远程配文件。
6.0、在解释配置前先熟悉nacos用户界面。
- 创建新的命名空间
命名空间可以先理解为是用来分类的,方便我们对配置文件分类管理(可以当作:一级分类
)。 - 创建远程配置文件:
6.1、根据公式创建远程配置文件。
- 首先我们先来配置两个yml
application.yml
spring:
profiles:
active: dev # 表示开发环境
#active: test # 表示测试环境
#active: info # 表示生产环境
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格式的配置
group: Test_GROUP # 在nacos server用户界面中获取
namespace: aedc232d-98ac-4fef-ac63-46b048228751 # 在nacos server用户界面中获取, 默认的命名空间是pubic(pubic没有 命名空间id)
# 这个公式用来确定 Data ID的值
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 根据application、bootstrap 着两个配置文件的内容得:
# spring.application.name = nacos-config-client
# spring.profile.active = dev
# spring.cloud.nacos.config.file-extension = yaml
# data id = nacos-config-client-dev.yaml 得到这个data id 后我们就可以去创建远程配置文件了
获得了data id后 创建远程配置文件
核对命名空间、组在bootstrap.yml中是否一致
6.2、自定义的方式创建远程配置文件。
先去nacos server用户界面创建一个远程配置文件。
根据创建的配置文件修改bootstrap.yml
# 注意:配置中心相关的配置,必须配置在bootstrap.properties里
# 配置中心
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 指定命名空间
spring.cloud.nacos.config.namespace=aedc232d-98ac-4fef-ac63-46b048228751
# 自定义data id和分组(data id必须带扩展名,名字随意。不指定分组默认为:DEFAULT_GROUP)
spring.cloud.nacos.config.ext-config[0].data-id=my-data-id.yaml
# 指定组 ,如果不知道默认为:DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[0].group=Test_GROUP
# 是否支持动态刷新,当自定义data id 时默认不支持
spring.cloud.nacos.config.ext-config[0].refresh=true
# 注意:ext-config[0] 中的数字表示注册中心的配置优先级,越大优先级越高
7、nacos config(配置中心)实现远程动态更改数据源
我们通过远程配置文件修改数据源的连接信息,以更改数据库为例。
7.1、建库建表
- 创建两个数据库test、test1
- 创建一个分别创建一个一样的user表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
分别在test、test1 的user表插入数据
test
INSERT INTO `user` VALUES (1, '李华', 18);
INSERT INTO `user` VALUES (2, '小明', 20);
INSERT INTO `user` VALUES (3, 'test数据库', 20);
SET FOREIGN_KEY_CHECKS = 1;
test1
INSERT INTO `user` VALUES (1, 'test1数据库', 18);
SET FOREIGN_KEY_CHECKS = 1;
7.2、导入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>
<!--导入mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
</dependencies>
7.3、修改yml配置
application.yml
spring:
profiles:
active: dev # 表示开发环境
#active: test # 表示测试环境
#active: info # 表示生产环境
# main:
# allow-bean-definition-overriding: true # 有相同bean时覆盖
mybatis:
mapperLocations: classpath:mapper/*.xml
type-aliases-package: com.lihua.config.pojo # 所有pojo别名类所在包
configuration:
map-underscore-to-camel-case: true # 驼峰命名自动映射
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格式的配置
group: Test_GROUP
namespace: aedc232d-98ac-4fef-ac63-46b048228751 # 默认的命名空间是pubic(pubic没有 命名空间id)
# 这个公式用来确定 Data ID的值 ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
nacos远程配置文件的内容:
7.4、主启动类
注意:排除spring boot自动装配的DruidDataSource bean。使用远程配置文件中的数据源配置
/**
*
* 主启动类
* exclude = DataSourceAutoConfiguration.class 排除spring boot 自动帮我们配置的DruidDataSource bean,使用我们自己的
* @author 15594
*/
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
public class ConfigMain3377 {
public static void main(String[] args) {
SpringApplication.run(ConfigMain3377.class,args);
}
}
7.5、配置数据源
package com.lihua.config.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
/**
* 数据源,通过nacos远程配置文件配置
* @author 15594
*/
@Configuration
@RefreshScope
public class DruidConfiguration {
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
/**
* @Primary 优先选择这个bean
* */
@Bean
@RefreshScope
public DruidDataSource dataSource(){
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(this.dbUrl);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
return datasource;
}
}
7.6、常规的数据层、业务层、控制层代码
user实体类:
public class User {
private long id;
private String name;
private long age;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getAge() {
return age;
}
public void setAge(long age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
控制层:
/**
* 控制层
* @author 15594
*/
@RestController
public class UserController {
@Autowired
@Qualifier("UserService")
private UserService userService;
@RequestMapping("/queryUser")
public @ResponseBody List<User> queryUser() {
List<User> users = userService.queryUsers();
return users;
}
}
数据层:
/**
* 数据层,操作用户表
* @author 15594
*/
@Mapper
@Repository
public interface UserMapper {
/**
* 查询所有用户
*
* @return 返回所有用户的集合
* */
@Select("select * from user")
List<User> queryUsers();
}
业务层:
//接口:
/**
* 业务层
* @author 15594
*/
public interface UserService {
/**
* 查询所有用户
* @return 返回所有用户的集合
* */
List<User> queryUsers();
}
/**
*
* 业务层
* @author 15594
*/
@Service("UserService")
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
public List<User> queryUsers() {
return userMapper.queryUsers();
}
}
7.7、测试
访问:http://localhost:3377/queryUser
到nacos配置中心,修改远程配置文件
再次访问:http://localhost:3377/queryUser