注册中心Eureka基本运用

原理

作为一个注册配置中心进行使用,他能够对服务者和消费者进行操作,当服务开启的时候会把服务者的接口服务注册到eureka-server,然后消费者去拉取列表就可以实现跨服务运行。这种是为了解决平常关于远程服务调用url写死的问题,他可以进行一个类似的把接口封装成一个自己的连接方式,由ribbon进行拦截然后去获取对应的真正url,通过心跳反应进行判断该服务者有没有挂掉。消费者通过负载均衡算法去获取目的url。


正常运行流程:

1.Eureka Server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过 Replicate 同步注册表,每个 Eureka Server 都存在独立完整的服务注册表信息。

2.Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务。

3.Eureka Client 会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常。

4.当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例。

5.单位时间内 Eureka Server 统计到有大量的 Eureka Client 没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端。

6.当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式。

7.Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地。

8.服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存。

9.Eureka Client 获取到目标服务器信息,发起服务调用。

10.Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除。

搭建

首先需要搭建eureka-server的服务中心需要导入依赖,编写启动类,然后进行yml文件配置,这个可以理解成一个独立的模块

xml 复制代码
//创建新的模块导入依赖    
<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
</dependencies>

然后创建spring启动类,并把他标识为eureka的服务端

less 复制代码
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
//    这里如果直接放在java包下无法改名
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
}

application.yml自己创建:

yaml 复制代码
server:
  port: 10086  #本服务端口
spring:
  application:
    name: eurekaserver   #服务名称
eureka:
  client:
    service-url: http://127.0.0.1:10086/eureka      #启动的时候也会把自己也注册进去

服务注册和实现

导入依赖,注意是客户端的

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

然后一样写在配置文件的内容,

然后可以进入ip+端口进入Eureka的客户端页面Eureka⁤,这里主要的是对实例的看,当然实例也可以是服务集

yaml 复制代码
server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    username: root
    password:
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: eurekaserver   #服务名称
mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
​
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka #启动的时候也会把自己也注册进去

这样就有了把那些其他服务给变成一个由eureka管理的列表项,那么消费端再根据负载均衡去拉去

less 复制代码
@Bean
@LoadBalanced     //注意这里不能相反,因为得先注入bean,也可能不是bug,存疑
public RestTemplate restTemplate() {
     return new RestTemplate();
    }

注意这里的名字实际上是服务端开启的服务名称

less 复制代码
    @GetMapping("{orderId}")
    public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
        Order order = orderService.queryOrderById(orderId);
        String url  = "http://userservice/user/"+ order.getUserId();
        order.setUser(restTemplate.getForObject(url, User.class));
        return order;
    }

负载均衡Ribbon

这里的原理就是通过注解Loadbalance 进行拦截,里面由拦截器loadbanlanceInterceptor 拦截请求后获取当前url的服务名称 ,走进入execute 方法里面去获取到ServerList里面就可以eureka的列表,通过rule的规则去实现接口Irule ,一般采用轮询,最小连接数,随机,权重等算法,默认采用的是轮询 ,Irule默认去走ZoneAvoidanceRule,根据Zone(类似多联服务器,机房的机制)选择列表,然后轮询。

编辑

那么在主类放入Bean组件里面进行new就能更改均衡方式,当然也可以在配置文件里面改,不详细展开

typescript 复制代码
    @Bean
    public IRule iRule(){
     return new RandomRule();   
    }

饥饿加载

饥饿加载的原理是在页面首次加载时不加载任何资源,只有当用户需要访问某个特定的资源时,才会加载该资源。这种方式可以有效地减少初始加载时间,提高用户的访问速度和体验。

由于Ribbon默认采用的是懒加载,也就是第一次访问页面的时候才会去创建LoadBalanceClient,请求时间长,尽可能让他在创建项目的时候启动,从而降低第一次访问的耗时,在配置文件里面可以设置微服务名称进行加载

饥饿加载的好处不仅仅是减少初始加载时间,还可以减少带宽的消耗。由于饥饿加载只加载当前需要的资源,而不加载全部资源,因此可以节省服务器和客户端之间的数据传输量,减少带宽的消耗。

yaml 复制代码
ribbon:
  eager-load:
    enabled: true
    clients: userservice   #指定这个服务进行预加载

对于代码和配置文件的情况一种好处就是代码灵活但需要重新发布,但是配置文件却不能全局修改

相关推荐
凡人的AI工具箱2 小时前
AI教你学Python 第11天 : 局部变量与全局变量
开发语言·人工智能·后端·python
是店小二呀2 小时前
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
开发语言·c++·后端
canonical_entropy2 小时前
金蝶云苍穹的Extension与Nop平台的Delta的区别
后端·低代码·架构
我叫啥都行3 小时前
计算机基础知识复习9.7
运维·服务器·网络·笔记·后端
无名指的等待7124 小时前
SpringBoot中使用ElasticSearch
java·spring boot·后端
.生产的驴4 小时前
SpringBoot 消息队列RabbitMQ 消费者确认机制 失败重试机制
java·spring boot·分布式·后端·rabbitmq·java-rabbitmq
AskHarries5 小时前
Spring Boot利用dag加速Spring beans初始化
java·spring boot·后端
苹果酱05675 小时前
一文读懂SpringCLoud
java·开发语言·spring boot·后端·中间件
掐指一算乀缺钱5 小时前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
计算机学姐8 小时前
基于python+django+vue的影视推荐系统
开发语言·vue.js·后端·python·mysql·django·intellij-idea