Nacos简介
Nacos 可以发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
其中,Nacos实现注册中心和分布式配置中心,默认的端口号是8848。
Nacos安装与启动
1、环境准备
- Centos7系统环境
- JDK1.8
- Nacos安装包
2、下载
wget https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.tar.gz
3、解压安装包
tar -zxvf nacos-server-1.1.4.tar.gz
4、单击启动
切换到 /nacos/bin 路径下,输入启动命令:
sh startup.sh -m standalone
启动日志可以在 /usr/local/leyou/nacos/logs/start.out 里查看。
查看日志的命令:
tail -f /usr/local/leyou/nacos/logs/start.out
5、开放端口8848
由于Nacos默认端口号是8848,所以在本地测试之前需要将端口打开。
1、开启防火墙
systemctl start firewalld
2、开放指定端口
firewall-cmd --zone=public --add-port=1935/tcp --permanent
命令含义:
–zone #作用域
–add-port=1935/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
3、重启防火墙
firewall-cmd --reload
4、查看端口号
netstat -ntlp //查看当前所有tcp端口·
端口打开之后,在本地电脑测试,在浏览器地址栏输入地址(服务器ip加端口号/nacos):http://192.168.18.132:8848/nacos
默认账号密码都是 nacos 。即可进入 Nacos 管理页面。
Nacos使用
我们都知道Nacos提供服务注册与发现和配置管理,下面一起来看一下具体是如何使用的。
服务注册
下面编写两个应用 服务提供者与服务消费者 来验证服务的注册与发现。
服务提供者
1、添加依赖
首先需要创建一个 Spring Boot 项目,在 pom.xml 中添加以下依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tfjybj.exam</groupId>
<artifactId>exam_parent</artifactId>
<packaging>pom</packaging>
<version>1.0.0-SNAPSHOT</version>
<modules>
<module>meiti-member</module>
<module>mayikt-order</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- springboot 整合web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
主要内容有三部分:
- :指定Spring Boot版本。
- :指定spring cloud alibaba 的版本,进行版本管理。
- :当前项目依赖的jar包。引入了Nacos的服务注册与发现依赖 spring-cloud-starter-alibaba-nacos-discovery 和 spring-boot-starter-web 依赖。
2、在项目下建立一个Maven Module。创建应用主类,并实现一个HTTP接口
应用主类:
@SpringBootApplication
public class AppSpringBoot {
public static void main(String[] args) {
SpringApplication.run(AppSpringBoot.class);
}
}
创建一个service包,在其下创建一个service类实现一个HTTP接口:
@RestController
public class ProviderService {
@Value("${server.port}")
private String serverPort;
@GetMapping("/getUser")
public String getUser(Integer userId){
return "Provider,server port is:"+serverPort;
}
}
3、配置服务名称和Nacos地址
在配置文件application.yml中加入以下内容:
spring:
application:
name: Provider
cloud:
nacos:
discovery:
#nacos的注册地址
server-addr: 192.168.18.132:8848
server:
port: 8081
4、启动项目测试效果
项目运行成功后,打开Nacos 管理页面,在服务管理下的服务列表可以看到注册上的服务 Provider。
服务消费者
在建立好的Spring Boot项目中再新建一个 Maven Module 来充当服务消费者。
1、添加服务名称和Nacos注册地址。
在配置文件中application.yml中添加以下内容:
spring:
application:
name: Discovery
cloud:
nacos:
discovery:
#nacos注册地址
server-addr: 127.0.0.1:8848
server:
port: 8090
2、创建应用主类,并实现一个HTTP接口,在该接口中调用服务提供者的接口。
从注册中心获取服务或服务集群的列表的话,通过RPC远程调用涉及到本地负载均衡算法,用负载均衡算法从列表选择一个服务,负载均衡算法有以下几种:
- 一致性hash算法
- 轮询,权重
- 随机
(1)轮询的负载均衡算法的实现思路:
为了保证线程安全,这里使用了 AtomicInteger ,去实现轮询的负载均衡算法。
public interface LoadBalancer {
/***
* 从注册中心集群列表中获取单个地址
* @param serviceInstances
* @return
*/
ServiceInstance getSingleAddress(List<ServiceInstance> serviceInstances);
}
@Component
public class RotationLoadBalancer implements LoadBalancer {
/***
* 从0开始计数
*/
private AtomicInteger atomicInteger=new AtomicInteger(0);
@Override
public ServiceInstance getSingleAddress(List<ServiceInstance> serviceInstances) {
int index=atomicInteger.incrementAndGet()%serviceInstances.size();
return serviceInstances.get(index);
}
}
(2)实现一个HTTP接口
@RestController
public class OrderService {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancer loadBalancer;
@RequestMapping("/orderToMember")
public Object orderToMember(){
//1、根据服务名称从 注册中心获取集群列表地址
List<ServiceInstance> instances = discoveryClient.getInstances("Provider");
//2、列表任意选择一个 实现本地RPC调用rest
ServiceInstance serviceInstance = loadBalancer.getSingleAddress(instances);
URI rpcMemberUrl = serviceInstance.getUri();
String result = restTemplate.getForObject(rpcMemberUrl+"/getUser", String.class);
return "订单调用会员返回结果:"+result;
}
/***
* 第一种方式
* 基于Ribbon实现本地负载均衡
* @return
*/
@RequestMapping("/orderToRibbonMember")
public Object orderToRibbonMember(){
String result = restTemplate.getForObject("http://Provider/getUser", String.class);
return "订单调用会员返回结果:"+result;
}
/***
* 第二种方式
* 根据loadBalancerClient实现客户端负载均衡
* @return
*/
@RequestMapping("/loadBalancerClientMember")
public Object loadBalancerClientMember(){
ServiceInstance result=loadBalancerClient.choose("Provider");
return result;
}
}
这里使用了Spring cloud common中的LoadBalancer来挑选服务实例信息,然后从挑选出的实例信息中获取可以可访问的URI,拼接上服务提供者的接口名字来发起调用。