SpringCloud从零到一之注册中心与负载均衡

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注册中心服务搭建

  1. 创建Eureka注册中心的模块进行搭建。
  2. 在启动类中增加==@SpringBootApplication==注解。
  3. 在springapplication.yml文件中填写以下配置文件,表明Eureka的地址、名称和端口号
	server:
	  port: 10086
	spring:
	  application:
	    name: eurekaserver # eureka的服务名称
	eureka:
	  client:
	    service-url: # eureka的地址信息
	      defaultZone: http://localhost:10086/eureka
  1. 访问localhost:10086查看是否配置成功。

服务的注册与发现

  1. 在该服务pom文件中引入以下依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  1. 进行配置文件编写
spring:
  application:
    name: 服务名称
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka # 注册中心地址
  1. 如果想要进行服务的拉取和调用,需要进行以下几步:
    首先创建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实现可以修改负载均衡规则,有两种方式:

  1. 通过代码的方式,创建负载均衡策略Bean并在RestTemplate的Bean实例前添加==@LoadBalanced==注解,该方式对所有的服务都进行该种方式的负载均衡策略。
	@Bean
	public IRule randomRule(){
    
    
	    return new RandomRule();
	}
  1. 在配置文件中配置。
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支持服务列表变更的消息推送模式,服务列表更新更及时

Guess you like

Origin blog.csdn.net/qq_44157349/article/details/120793459