服务治理--Eureka

将调用地址写死势必会造成一些问题,所以要想办法进行优化,那么就出现了服务治理,也就是Eureka.

服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化服务注册与服务发现

  • 服务注册:所有微服务都会被注册到服务注册中心,Eureka的每个微服务都会定时(30秒)向注册中心发出心跳,保证注册中心直到自己是正常运行的,如果心跳异常,那么注册中心就会将异常的微服务剔除。

  • 服务发现:服务调用方向服务注册中心咨询服务,并获取所有服务的实例清单,实现对具体服务实例的访问

这里引入两个概念:提供者和消费者。

提供者:提供服务的一方。

消费者:调用其他微服务的一方。

每个微服务都可以是消费者也可以是提供者。

下面通过代码实现:

1、添加Eureka的服务模块

2、在pom.xml中添加Eureka服务端依赖

    <dependencies>
        <!--euraka服务端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

3、添加配置文件application.yml,(Eureka本身也是个服务,配置文件中添加路径之后,它会将自己也注册到服务注册中心,在访问的页面可以查看服务列表

service-url:
  defaultZone: http://127.0.0.1:8761/eureka

  

但是下面这一部分就是说,关闭将自己注册到服务中,所以,这两部分写一个就行,想将自己注册到服务中心,就写上面的路径,不想将自己注册到服务中心,就只写下面配置信息 

     # 注册中心的职责是维护服务实例,不需要去检索服务
    fetch-registry: false
    # 默认设置下,注册中心会将自己作为客户端来尝试注册自己,设置为false代表不向注册中心注册自己
    register-with-eureka: false

完整示例:这里就写的是不将自己注册进服务中心,将自己注册到注册中心的那个路径用#注释了 

server:
  port: 8761
spring:
  application:
    name: eureka-server
eureka:
  client:
    # 注册中心的职责是维护服务实例,不需要去检索服务
    fetch-registry: false
    # 默认设置下,注册中心会将自己作为客户端来尝试注册自己,设置为false代表不向注册中心注册自己
    register-with-eureka: false
#    service-url:
#      defaultZone: http://127.0.0.1:8761/eureka

4、添加启动类,添加注释@EnableEurekaServer   // 开启注册中心功能

package com.itheima;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer// 开启注册中心功能
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
}

5、 根据配置文件中的端口号,启动应用,访问成功

那么如何将其他服务注册到Eureka中呢? 《注册过程》

1、在想要注册的服务中添加Eureka客户端依赖

<!-- Eureka客户端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2、在application.yml中添加配置信息

# eureka服务器地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

 3、重新启动,在Eureka界面发现已经注册成功。(如果到这里发现没有注册成功,可以在启动类上添加注解:@EnableDiscoveryClient)

 那么这样将微服注册之后要干嘛呢,就是要解决url路径写死的问题。

我们将url路径部分进行修改,将ip和端口号替换成微服务的应用名称:

1、修改路径

2、确保两个服务都已注册成功

这样再次访问,就就可以通过Eureka进行访问。除此之外,如果想要实现负载均衡(也就是加入提供者是多个,那么消费者要选择哪个提供者呢?怎么选呢?这里就由Eureka中的Ribbon进行负载均衡),这个时候,只需要在RestTamplate上添加注解@LoadBalanced就可以了:


负载均衡:

我们添加了@LoadBalanced注解实现了负载均衡,那么是怎么实现的呢?下面来进行总结阐述一下。

负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元上进行执行。

根据负载均衡发生位置的不同,一般分为服务端负载均衡客户端负载均衡

服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡。

客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求。  

 当出现多个提供者的时候,配置好负载均衡,就会发现请求会按照负载均衡中的规则(默认是轮询机制,也就是平均分配请求),进行有规律的访问。

负载均衡实现原理

我们发出的请求,明明是http://user-service/user/1,怎么变成了http://localhost:8081/user/1的呢?

显然有人帮我们根据service名称,获取到了服务实例的ip和端口,它就是Ribbon组件的LoadBalancerInterceptor。

这个类会在对RestTemplate的请求进行拦截,然后通过从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。如下图:

负载均衡原理总结:

1. 在RestTemplate上添加了@LoadBalanced注解后,会使用LoadBalancerClient来配置RestTemplate
2. Spring Cloud Ribbon 的自动配置类LoadBalancerAutoConfiguration中的@ConditionalOnBean(LoadBalancerClient.class)条件成立
3. 自动配置中添加了LoadBalancerInterceptor,这个拦截器会拦截请求,通过图中的Dynamic***的这个类进行从Eureka的服务列表拉取服务信息,然后通过IRule中配置的规则,也就是底层的负载均衡算法选出一个地址进行调用 。

 负载均衡策略:

负载均衡的规则都定义在IRule接口中,它有很多不同的实现类,分别代表不同规则

内置负载均衡规则类规则描述
RoundRobinRule简单轮询服务列表来选择服务器。第一次到8081,第二次就到8082,第三次又到8081,第四次又到8082…
AvailabilityFilteringRule可用过滤规则,其实它功能是先过滤掉不可用的Server实例,再选择并发连接最小的实例。
WeightedResponseTimeRule为每一个服务器计算一个==权重==范围区间,权重区间的宽度越大,而权重区间宽度越大被选中的概率就越大。
ZoneAvoidanceRule以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做==轮询==。
BestAvailableRule忽略那些短路的服务器,并选择并发数较低的服务器。
RandomRule==随机==选择一个可用的服务器。
RetryRule轮询重试(重试采用的默认也是轮询)

负载均衡策略的配置: 

SpringCloud允许通过定义IRule修改负载均衡规则,有两种方式:

  • 全局方式:向Spring容器中直接放入想要使用的策略对象

     @Bean 
     public IRule randomRule(){      
            return new RandomRule();  
    }
  • 局部方式:在配置文件中,针对指定的服务提供者配置策略

    user-service: # 给某个微服务配置负载均衡规则,这里是user-service服务  
         ribbon:    
             NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

注意: 负载均衡策略需要配置在服务消费者一方,也就是调用其他服务的那个服务


饥饿加载:

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。

而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

ribbon:  
	eager-load:    
		enabled: true # 开启饥饿加载    
		clients:       
		- user-service  # 指定饥饿加载的服务名称

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值