SpringCloud从零到一之注册中心与负载均衡
文章目录
了解分布式的朋友一定熟悉zookeeper,它起到的就是注册中心的作用,然后通过Dubbo可以进行服务的注册和订阅。微服务就是集分布式大成的东西,也是需要注册中心进行服务的注册和订阅。
简单搭建SpringCloud环境
// SpringCloud环境简单搭建
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- nacos管理依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
注册中心之Eureka
Eureka作为SpringCloud的注册中心,可以进行服务的注册和发现。
主要流程如下:
- A服务创建实例后,将信息注册到eureka-server中。
- eureka-server保存服务名称到服务地址的映射关系。
- B服务拉取eureka-server中的服务列表。
Eureka注册中心服务搭建
- 创建Eureka注册中心的模块进行搭建。
- 在启动类中增加==@SpringBootApplication==注解。
- 在springapplication.yml文件中填写以下配置文件,表明Eureka的地址、名称和端口号
server:
port: 10086
spring:
application:
name: eurekaserver # eureka的服务名称
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://localhost:10086/eureka
- 访问localhost:10086查看是否配置成功。
服务的注册与发现
- 在该服务pom文件中引入以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 进行配置文件编写
spring:
application:
name: 服务名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka # 注册中心地址
- 如果想要进行服务的拉取和调用,需要进行以下几步:
首先创建restTemplate并注入spring容器,通过其发送请求的api进行服务调用。
然后在service层进行服务的调用。
@Bean
@LoadBalanced // 负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
// service层
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2. 利用RestTemplate发送http请求,查询用户
// 2.1 url
String url = "http://userservice/user/"+order.getUserId();
// 2.2 发送http请求,实现远程调用
User user = restTemplate.getForObject(url, User.class);
// 3. 封装user到 order
order.setUser(user);
// 4.返回
return order;
}
负载均衡
SpringCloud中,内置了Ribbon进行负载均衡的配置,可以通过配置不同的负载均衡策略进行修改。
主要的负载均衡策略有三种:
- 轮询
- 随机
- 权重
自定义负载均衡
通过定义IRule实现可以修改负载均衡规则,有两种方式:
- 通过代码的方式,创建负载均衡策略Bean并在RestTemplate的Bean实例前添加==@LoadBalanced==注解,该方式对所有的服务都进行该种方式的负载均衡策略。
@Bean
public IRule randomRule(){
return new RandomRule();
}
- 在配置文件中配置。
serviceName: # 给某个微服务配置负载均衡规则,serviceName代指服务名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
开启饥饿加载
由于Ribbon默认是懒加载,即调用时才创建,当用户第一次调用时还需要加载Ribbon,十分缓慢,所以使用饥饿加载,即初始化时就加载。
ribbon:
eager-load:
enabled: true
clients: userservice
注册中心之Nacos
在父工程中添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
在各个服务中添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
服务分级存储模型
我理解的服务分级存储模型就是Nacos对服务分集群进行管理;主要的目的在于容灾。
服务分级存储模型就是服务–>集群–>实例;通过这三个级别进行服务的调用与治理,看情况对同一/不同集群中的服务实例进行调用。
配置服务集群
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 集群名称
修改负载均衡
又由于默认的负载均衡策略无法优先同一集群进行负载均衡,所以需要修改负载均衡策略:
serviceName:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
环境隔离
Nacos提供了namespace来实现环境隔离功能。
- nacos中可以有多个namespace
- namespace下可以有group、service等
- 不同namespace之间相互隔离,例如不同namespace的服务互相不可见
给微服务配置namespace只能通过修改配置来实现:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
Eureka与Nacos的区别
Nacos与Eureka的相同点:
- 都采用心跳进行健康检测
- 都可以进行服务的注册和发现
Nacos与Eureka的区别:
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时