0


注册中心Eureka基本运用

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文件配置,这个可以理解成一个独立的模块

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

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

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

application.yml自己创建:

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

服务注册和实现

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

     
   <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

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

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

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管理的列表项,那么消费端再根据负载均衡去拉去

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

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

    @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就能更改均衡方式,当然也可以在配置文件里面改,不详细展开

    @Bean
    public IRule iRule(){
     return new RandomRule();   
    }
饥饿加载

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

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

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

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

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

标签: eureka 云原生 java

本文转载自: https://blog.csdn.net/weixin_74166266/article/details/136587189
版权归原作者 hwoss 所有, 如有侵权,请联系我们删除。

“注册中心Eureka基本运用”的评论:

还没有评论