目录
1、什么是Nacos
官方:一个更易于构建云原生应用的动态服务发现
、服务配置
、和服务管理
平台
理解:注册中心(如:服务地址注册进去根据名称调用)、配置中心(如:每个服务yaml中的配置)、服务管理(可视化管理平台)
2、本地启动(windows单机版):
1、下载nacos,并启动
-
本地启动单机模式需要修改
nacos/bin/startup.cmd
中set MODE="cluster"
为set MODE="standalone"
(集群修改为单机) -
修改nacos数据源
nacos/conf/application.properties
,默认关闭,存在内存中。 -
启动完成,访问路径:http://localhost:8848/nacos/#/login 登录名和密码都是nacos
百度网盘下载链接:https://pan.baidu.com/s/1YpbW7TgQpXY5y8ayn68lRw
提取码:l18x
2、 pom里面添加服务注册 和 配置中心(父项目依赖spring-cloud-alibaba-dependencies)
<!-- nacos 服务的注册发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos 配置中心做依赖管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置yaml
# 应用名称(nacos会将改名称作为服务名称)
spring:
application:
name: order-service
cloud:
nacos:
# nacos 服务注册
discovery:
server-addr: 127.0.0.1:8848
namespace: byzq-local # 命名空间
# nacos 配置中心
config:
server-addr: 127.0.0.1:8848
namespace: byzq-local # 命名空间
group: DEFAULT_GROUP # 使用的 nacos 配置分组,默认为 DEFAULT_GROUP
file-extension: yaml # 使用的 nacos 配置集的 dataId 的文件拓展名,默认为 properties
# 共享配置,没有则不加
shared-configs:
- test.yaml
3、服务器启动(linux集群版):
1、下载并解压到对应目录下,copy三份分别为nacos8849,nacos8850,nacos8851
2、分别修改conf/application.properties文件中端口为8849,8850,8851
3、分别开启数据库,集群是保存到数据库中保证数据一致
4、创建nacos数据库并执行conf/nacos-mysql.sql文件中的sql
5、copy配置文件conf/cluster.conf.example为conf/cluster.conf并修改如下
6、如果服务器内存不够大,可修改集群内存大小,在bin/startup.sh目录下,第一个是单机占用内存,第二个是集群占用内存
7、然后启动分别启动bin/startup.sh即可(注意启动数据库)
8、配置nginx负载均衡,在nginx/conf/nginx.conf的http中配置如下
# 访问localhost:8847/nacos/反向代理为http://127.0.0.1:8849/nacos/或http://127.0.0.1:8850/nacos/,轮询负载均衡机制
upstream nacoscluster {
server 127.0.0.1:8849;
server 127.0.0.1:8850;
server 127.0.0.1:8851;
}
server {
# 监听本地端口为8847
listen 8847;
server_name localhost;
location /nacos/ {
proxy_pass http://nacoscluster/nacos/;
}
}
9、启动sbin下的nginx,然后即可访问localhost:8847/nacos/,yaml中修改nacos地址为127.0.0.1:8847
4、负载均衡介绍
负载均衡有两类,服务端负载均衡和客户端负载均衡;
1、客户端负载均衡
例如 Ribbon。如下所有服务地址都注册到了注册中心,然后服务消费者可以去注册中心获取所有服务地址,然后自己通过负载均衡算法选择一个服务地址进行访问。由服务消费者(客户端)完成负载均衡。
2、服务端负载均衡
服务端负载均衡有三种实现方式:
- 基于DNS实现负载均衡
- 基于硬件实现负载均衡
- 基于软件实现负载均衡
这里介绍基于软件实现负载均衡,例如Nginx,在nginx中配置所有服务地址,服务消费者调用时nginx通过轮询负载均衡算法进行分配服务地址。由服务端(nginx)完成负载均衡分配
3、常见负载均衡算法
5、nacos中的Ribbon负载均衡
默认为轮询
负载均衡策略
1、nacos-discovery默认加入了Ribbon的依赖
2、只需要在restTemplate中加入@LoadBalanced注解即可引入负载均衡
3、然后再调用服务时用服务名称即可
6、Ribbon默认负载均衡策略
1、Ribbon自带的负载策略类
# com.netflix.loadbalancer.RoundRobinRule - 轮询
# com.netflix.loadbalancer.RandomRule - 随机
# com.netflix.loadbalancer.RetryRule - 重试,先按RoundRobinRule进行轮询,如果失败就在指定时间内进行重试
# com.netflix.loadbalancer.WeightedResponseTimeRule(nacos中权重要使用NacosRule,nacos对权重进行了基本配置的扩展) - 权重,响应速度越快,权重越大,越容易被选中。
# com.netflix.loadbalancer.BestAvailableRule - 先过滤掉不可用的处于断路器跳闸转态的服务,然后选择一个并发量最小的服务
# com.netflix.loadbalancer.AvailabilityFilteringRule - 先过滤掉故障实例,再选择并发量较小的实例
# com.netflix.loadbalancer.ZoneAvoidanceRule - 默认规则,复合判断server所在区域的性能和server的可用性进行服务的选择。
2、如何修改Nacos中Ribbon的默认负载均衡策略
方式一:
- 新建一个不会被@ComponentScan组件扫描到的包,如:com.rules
- 在该包下新建自己的负载均衡算法的规则类
- 主启动类上添加注解:@RibbonClient
package com.rules;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @desc 自定义负载均衡策略(用于替换默认的RoundRobinRule轮询策略)
*/
@Configuration
public class MyLoadBalanceRule {
@Bean
public IRule myRule(){
return new RandomRule(); // 改为随机算法规则
}
方式二:
- 配置yaml来修改Ribbon默认负载均衡策略
这里设置负载均衡为权重,注意不能使用WeightedResponseTimeRule而要使用nacos自己扩展的NacosRule
stock-service:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
然后通过nacos设置服务权重,权重越大越容易被选中
3、自定义一个负载均衡策略
package com.ribbon;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class CustomRule extends AbstractLoadBalancerRule {
// 获取基本属性
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
// 用来获取服务
@Override
public Server choose(Object o) {
// 实现一个简单的自定义负载均衡策略
ILoadBalancer loadBalancer = this.getLoadBalancer();
// 获取当前请求服务实例
List<Server> reachableServers = loadBalancer.getReachableServers();
// 获取随机数
int random = ThreadLocalRandom.current().nextInt(reachableServers.size());
// 随机获取一个服务
Server server = reachableServers.get(random);
return server;
}
}
以上可以自定义一个负载均衡策略,但是在第一次调用服务的时候才会去动态加载负载均衡策略,这样会影响调用速率。通过以下配置在启动服务时初始化负载均衡策略
ribbon:
eager-load:
enabled: true # 开启ribbon饥饿加载
clients: stock-service # 需要启动负载均衡的服务,多个用逗号隔开
7、Nacos配置中心
1、配置管理界面如下:
2、权限控制
1)首先要先将conf/application.properties中如下配置改为true(需要重启nacos)
2)添加用户3)给用户配置角色
4)给角色赋予权限
用@value注解读取配置文件信息时需要在类上加入@RefreshScope注解才能动态读取配置文件信息(不重启)