一、Nacos简介
1.概述
①SpringCloud Alibaba Nacos服务注册和配置中心,它就是注册中心 + 配置中心的组合。
②Nacos = Eureka+Config +Bus,它替代Eureka做服务注册中心,替代Config做服务配置中心
2.服务注册中心对比
3.安装和运行
访问http://localhost:8848/nacos
,账号和密码都是nacos
二、Nacos做服务注册中心
1.基于Nacos的服务提供者9001
1.新建Module
2.修改pom
父pom(cloud2020的总pom)
<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>
本模块的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>
<!--日常通用jar包配置-->
<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>
<scope>test</scope>
</dependency>
</dependencies>
3.写yml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos配置地址,告诉服务提供者要注册进8848这个微服务上面
management:
endpoints:
web:
exposure:
include: '*' #监控的断电全部打开
4.主启动类
@EnableDiscoveryClient //我们不再使用Eureka了
@SpringBootApplication
public class PaymentMain9001
{
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
5.业务类
@RestController
public class PaymentController
{
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
6.测试
2.基于Nacos的服务提供者9002
1.新建Module
2.修改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>
<!--日常通用jar包配置-->
<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>
<scope>test</scope>
</dependency>
</dependencies>
3.写yml
server:
port: 9002
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
4.主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9002
{
public static void main(String[] args) {
SpringApplication.run(PaymentMain9002.class, args);
}
}
5.业务类
@RestController
public class PaymentController
{
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
6.测试
3.基于Nacos的服务消费者83
1.新建Module
2.修改pom
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</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>
<!--日常通用jar包配置-->
<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>
<scope>test</scope>
</dependency>
</dependencies>
3.写yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
#消费者将要去访问的微服务名称
service-url:
nacos-user-service: http://nacos-payment-provider
4.主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83
{
public static void main(String[] args)
{
SpringApplication.run(OrderNacosMain83.class,args);
}
}
5.业务类
config配置类
@Configuration
public class ApplicationContextBean
{
@Bean
@LoadBalanced //负载均衡(结合ribbon做负载均衡时一定要加这个注解)
public RestTemplate getRestTemplate()
{
return new RestTemplate(); //因为nacos自带ribbon,所以就可以使用RestTemplate
}
}
Controller类
@RestController
public class OrderNacosController
{
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}") //读取yml配置文件里的值
private String serverURL;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id)
{
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
6.测试
三、Nacos作为配置中心—基础配置
1.建客户端3377
1.建Module
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>
<!--一般基础配置-->
<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>
<scope>test</scope>
</dependency>
</dependencies>
3.写yml
bootstrap优先级高于application, 全局的配置放到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 #意思就是3377可以去8848上面读取yml的配置文件
②application.yml
spring:
profiles:
active: dev #表示开发环境
以上这两个配置的意思就是3377你要去配置中心8848Nacos里去拉一个dev的配置文件
4.主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377
{
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
5.业务类
@RestController
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
public class ConfigClientController
{
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
6.在Nacos中添加配置信息
DataId如何设置?
7.测试报错
8.测试
9.测试动态刷新功能
四、Nacos作为配置中心—分类配置
1.当前的问题
2.关于命名空间—分组—DataID
3.1三种方案加载配置 之 DataID方案
1.新建两个 同一命名空间下 同一分组下 不同命的两个DataID
2.修改yml
3.测试
3.2三种方案加载配置 之 Group方案
1.新建两个同一命名空间下 不同分组的 同名的DataID
2.改yml
3.测试
3.3三种方案加载配置 之 Namespace方案
1.新建两个命名空间
2.新建三个同一命名空间下、不同分组、同名的DataID
2.改yml
寻找命名空间id为那么一长串的、DEV_Group分组下的nacos-config-client-dev.yaml
3.测试
五、Nacos集群(极其重点)
1.集群需要什么?
2.Windows中切换数据库的步骤
测试
3.安装Linux版本的nacos
nacos解压在
/user/local/nacos/
里面(注意,你当时安装在/user而不是/usr目录下了)
一个nacos你可以startup 8848启动,但现在要安装三个nacos,那么就需要改nacos脚本,让它们的端口变成3333、4444、5555然后startup -p 3333
4.Linux中切换数据库
5.Nacos集群的配置
一个nacos你可以startup 8848启动,但现在要安装三个nacos,那么就需要改nacos脚本,让它们的端口变成3333、4444、5555然后startup -p 3333
1.指定nacos集群的端口
2.改startup.sh
你还得修改startup.sh告诉启动器这些端口的存在,这样启动时才能集群启动
(修改内容略去)
6.加入Nginx
7.测试1
1.启动nacos集群
可能会出现的问题:
可以看到你的集群只启动了两个,不要怀疑其他配置的问题,就是你内存问题,你可以到/user/local/nacos/nacos/bin目录下vi startup.sh来修改单个节点占用内存(参考网上的);或者扩大虚拟机内存也许。这样就可以启动三个
另外,如果http://192.168.56.103:3333/nacos
还有http://192.168.56.103:4444/nacos
还有http://192.168.56.103:5555/nacos
都可以访问,那才说明你的三个集群都没有问题
2.启动nginx
启动nginx可能会报如下错,你只需要建一下该文件即可
3.访问
注意:以前nginx的默认端口是80所以直接访问192.168.56.103就可以出现nginx的登录页面,现在行不通了,因为你改过端口了。
访问:http://192.168.56.103:1111/nacos/#/login
,账号密码都是nacos
8.测试2
微服务cloudalibaba-provider-payment9002启动注册进nacos集群