【微服务】 Eureka和Ribbon

一、Eureka

服务调用出现的问题:在远程调用另一个服务时,我们采用的解决办法是发送一次http请求,每次环境的变更会产生新的地址,所以采用硬编码会出现很多麻烦,并且为了应对并发问题,采用分布式部署,会形成一个集群,此时硬编码不知该指向哪个地址。

(一)Eureka的作用

①消费者该如何获取服务提供者具体信息?

  • 服务提供者启动时向eureka注册自己的信息
  • eureka保存这些信息
  • 消费者根据服务名称向eureka拉取提供者信息

②如果有多个服务提供者,消费者该如何选择?

  • 服务消费者利用负载均衡算法,从服务列表中挑选一个

③消费者如何感知服务提供者健康状态?

  • 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
  • eureka会更新记录服务列表信息,心跳不正常会被剔除
  • 消费者就可以拉取到最新的信息

总结 :

在Eureka架构中,微服务角色有两类:
EurekaServer:服务端 :注册中心。记录服务信息、心跳监控
EurekaClient:客户端

①Provider:服务提供者,例如案例中的user-service。注册自己的信息到EurekaServer,每隔30秒向EurekaServer发送心跳

②consumer:服务消费者,例如案例中的order-service。根据服务名称从EurekaServer拉取服务列表,基于服务列表做负载均衡,选中一个微服务后发起远程调用

(二)搭建Eureka服务

说明:在这个项目中一共有三个模块,order-server ,user-server ,eureka-server

1、搭建注册中心

①创建项目eureka-server,引入spring-cloud-starter-netflix-eureka-server的依赖

java 复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

②编写启动类,添加@EnableEurekaServer注解添加application.yml文件,编写下面的配置:

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
}
java 复制代码
server:
  port: 10086 #服务端口
spring:
  application:
    name: eurekaserver #eureka的服务名称
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

2、服务注册(如果想把order-server服务也注册到eureka,也是同样的操作)

①在user-service项目引入spring-cloud-starter-netflix-eureka-client的依赖

java 复制代码
        <!--Eureka客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

②配置yml文件

点击:10086/可以看到两个服务全部注册上来了

但是在上述操作中每个服务只有一个实例,如何开启多个实例:



启动得到新端口,注册得到两个实例:

3、服务拉取(服务发现):是基于服务名获取服务列表,然后对列表做负载均衡

在order-service完成服务拉取,获取在上面注册的user-service的两个实例信息

①修改OrderService的代码,修改访问的url路径,用服务名代替ip、端口:

java 复制代码
String url = "http://userservice/user/" + order.getUserId();

②在order-service的启动类OrderApplicationzhongde RestTemplate中添加负载均衡注册

二、Ribbon负载均衡

1、负载均衡流程

2、负载均衡策略:Ribbon的负载均衡规则是一个叫做IRule的接口定义的,每一个子接口都是一种规则

3、修改规则:定义IRule修改负载均衡规则

① 代码方式,在order-service的OrderApplication类中,定义一个新的IRule(作用于全局)

java 复制代码
    /**
     * 将负载均衡的规则设置为随机
     * @return
     */
    @Bean
        public IRule randomRule(){
            return new RandomRule();
        }

②配置文件方式:在order-service的application.yml文件中,添加新的配置以修改规则(只针对某个服务而言):

java 复制代码
userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

4、饥饿加载

第一次加载:

第二次加载:

可以看出第一次加载达到惊人的520ms+,而第二次加载则只有20ms不到。这是因为Ribbon采用的是懒加载,即第一次访问时才会去创建LoadBalabceClient,请求时间很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,配置开启饥饿加载:

java 复制代码
ribbon:
  eager-load:
    enabled: true
    clients:  #指定饥饿加载的服务名称
      - userservice

此时第一次加载只需要大概300ms左右

相关推荐
NE_STOP10 分钟前
SpringBoot--简单入门
java·spring
hqxstudying37 分钟前
Java创建型模式---原型模式
java·开发语言·设计模式·代码规范
Dcs1 小时前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
保持学习ing1 小时前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者1 小时前
Java的SPI机制详解
java
超级小忍2 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug2 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享2 小时前
Java Lombok 入门
java
程序无bug2 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队2 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端