一、Nacos
简介
Nacos命名的前四个字母分别取自Naming(服务注册,即服务命名管理
)和Configuration(服务配置)
的前两个字母,s取自Service
,也就是服务的意思。它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
简单一句话:Nacos 等价于 注册中心 + 配置中心
类似于 Eureka + Config + Bus
。
Nacos
官网地址:https://nacos.io/zh-cn/
,可以在这里下载和查阅官方文档。
二、安装并运行Nacos(Windows系统)
通过Nacos
下载地址选择合适的版本(最好选稳定版本)下载zip
包,需要本地配置好了Java8
和Maven
环境,解压缩后,运行startup.cmd
启动Nacos
,浏览器访问http://localhost:8848/nacos
查看管理后台,输入用户名密码(都是nacos
)进入。
1、修改nacos的运行模式为"单机模式"
2、双击"startup.cmd"文件,运行nacos
3、打开nacos页面
在浏览器中打开:http://192.168.10.3:8848/nacos/index.html
三、Nacos作为服务注册中心演示
1、基于Nacos的服务提供者
(1)创建Maven项目nacos-demo,删除src文件夹。在pom.xml文件中添加spring cloud alibaba依赖,代码如下:
<dependencyManagement>
<dependencies>
<!-- spring cloud alibaba 2021.0.4.0 依赖
强调:注意spring cloud alibaba nacos的版本号要与SpringBoot的版本号要匹配
-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
(2)在nacos-demo下新建nacos-provider模块
该模块的pom.xml如下:
<dependencies>
<!-- 引用spring cloud alibaba nacos注册中心/服务发现依赖
强调:注意spring cloud alibaba nacos的版本号要与SpringBoot的版本号要匹配
-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.4.0</version>
</dependency>
<!-- 引用父级spring boot的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引用父级spring boot健康监控的依赖 -->
<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>
<!-- 引用父级的lombok依赖 -->
<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)nacos-provider模块的application.yml
文件:
# 配置服务器的端口号
server:
port: 9001
spring:
application:
name: nacos-provider #应用名称
cloud:
nacos:
discovery:
server-addr: 192.168.10.3:8848 #nacos服务器地址和端口号
# 暴露所有监控端口
management:
endpoints:
web:
exposure:
include: "*"
(4)nacos-provider模块的启动类
package com.nacos.nacosprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
(5)nacos-provider模块的Controller
package com.nacos.nacosprovider.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 java.util.List;
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "Hello Nacos Discovery " + serverPort + "payment id: " + id ;
}
@GetMapping("/info")
public List<String> getInfo(){
return List.of("张三","李四","王五");
}
}
(6)运行nacos-provider模块
(7)启动Nacos
服务,在浏览器中访问http://192.168.10.3:8848//nacos
,点击左侧“服务管理”-“服务列表
”即可看到nacos-provider
服务已经注册进来了。
(8)访问nacos-provider模块的Controller
(8)新建第二个服务提供者模块(nacos-provider1),端口号为9002,它的application.yml文件如下
pom.xml文件和启动类与nacos-provider一样
(9)nacos-provider1模块的Controller如下:
(10)启动nacos-provider、nacos-provider1,查看Nacos
管理后台,nacos-payment-provider
服务名对应的实例数由1
变成了2
。如图所示
2、基于Nacos的服务消费者和负载
因为spring-cloud-starter-alibaba-nacos-discovery
依赖集成了ribbon
,所以能实现负载均衡。
(1)创建服务消费者consumer-nacos-order模块,pom.xml文件和nacos-provider模块一样。
注意:需要在pom.xml中添加负载均衡的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.6</version>
</dependency>
(2)配置consumer-nacos-order模块的application.yml文件
server:
port: 8083
# 配置应用信息
spring:
application:
name: nacos-order-consumer # 配置应用名称
cloud:
# nacos配置
nacos:
discovery:
server-addr: 192.168.10.3:8848 # 配置Nacos地址
# 消费者将去访问的微服务地址,这里采用服务名称查找服务(成功注册进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-provider
(3)consumer-nacos-order模块的主启动类
package com.start.consumernacosorder;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerNacosOrderApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerNacosOrderApplication.class, args);
}
}
(4)定义consumer-nacos-order模块的配置类
package com.start.consumernacosorder.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;
@Configuration
public class ApplicationContextConfig {
/**
* 获取RestTemplate对象
* @LoadBalanced:开启RestTemplate负载均衡,轮询方式
* @return 返回RestTemplate对象
*/
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
注意,这里一定要带上@LoadBalanced
注解,因为我们是通过服务名访问生产者的,现在同一个服务名称有两个生产者就没有办法具体解析到哪一个生产者中了,要通过负载均衡来分发。即使只有一个生产者,通过服务名访问,也要带上@LoadBalanced
注解,否则会报java.net.UnknownHostException错:
(5)定义consumer-nacos-order模块的Controller
package com.start.consumernacosorder.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 OrderController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}") //application.yml中配置的nacos-user-service
private String serverUrl;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String getCustomerInfo(@PathVariable("id") Integer id){
return restTemplate.getForObject(serverUrl + "/payment/nacos/" + id, String.class);
}
}
(6)启动Nacos
服务,启动两个生产者
和一个消费者
,在不同的浏览器页面中访问http://localhost:8083/consu
mer/payment/nacos/1,根据请求返回值,可以看到负载均衡生效了
,实际上,Nacos
有负载均衡能力,是因为它包含了Ribbon
的jar
包。