注册中心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   #指定这个服务进行预加载

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

相关推荐
Moment12 小时前
Vibe Coding 时代,到底该选什么样的工具来提升效率❓❓❓
前端·后端·github
Victor35612 小时前
MongoDB(27)什么是文本索引?
后端
可夫小子12 小时前
OpenClaw基础-3-telegram机器人配置与加入群聊
后端
IT_陈寒13 小时前
SpringBoot性能飙升200%?这5个隐藏配置你必须知道!
前端·人工智能·后端
aiopencode14 小时前
使用 Ipa Guard 命令行版本将 IPA 混淆接入自动化流程
后端·ios
掘金者阿豪14 小时前
Kavita+cpolar 打造随身数字书房,让资源不再混乱,通勤 、出差都能随心读。
后端
心之语歌14 小时前
Spring Security api接口 认证放行
后端
用户83562907805115 小时前
Python 实现 PPT 转 HTML
后端·python
0xDevNull15 小时前
MySQL索引进阶用法
后端·mysql
舒一笑15 小时前
程序员效率神器:一文掌握 tmux(服务器开发必备工具)
运维·后端·程序员