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

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

相关推荐
源代码•宸2 小时前
分布式缓存-GO(分布式算法之一致性哈希、缓存对外服务化)
开发语言·经验分享·分布式·后端·算法·缓存·golang
It's now2 小时前
Spring AI 基础开发流程
java·人工智能·后端·spring
计算机毕设VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue图书商城系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
夕颜1114 小时前
BeeAI 框架学习记录
后端
极市平台4 小时前
骁龙大赛-技术分享第5期(上)
人工智能·经验分享·笔记·后端·个人开发
程序员爱钓鱼4 小时前
Node.js 编程实战:路由处理原理与实践
后端·node.js·trae
hhzz5 小时前
Spring Boot整合Activiti的项目中实现抄送功能
java·spring boot·后端
Victor3566 小时前
Netty(7)如何实现基于Netty的TCP客户端和服务器?
后端
Victor3566 小时前
Netty(8)什么是Netty的ChannelPipeline和ChannelHandler?
后端
乘风!7 小时前
NSSM启动tomcat部署Java程序
java·服务器·后端·tomcat