1.Eureka入门笔记

  • Post author:
  • Post category:其他


Eureka入门


目录


Eureka入门


参考资料


Eureka介绍


Eureka是什么?


搭建Eureka Server(单例模式)


引入依赖


搭建Eureka Client


引入依赖


使用Eureka Client


集群Eureka Server


客户端向服务端注册时偏向于IP地址


如何保护Eureka服务端


支持JDK 11


健康检查:


关闭Eureka客户端刷新


Eureka自我保护机制


Eureka常用属性介绍


参考资料


eureka gitHub地址wiki


eureka官方文档

Eureka介绍


参考gitHub英文介绍

Eureka是什么?

Eureka是一种基于REST(Representational State Transfer)的服务,主要用于AWS云中定位服务,以实现中间层服务器的负载平衡和故障切换。我们称之为Eureka服务器。Eureka还附带了一个基于Java的客户机组件Eureka client,它使得与服务的交互更加容易。客户端还有一个内置的,基于轮训的负载均衡器。在Netflix,有更多的负载均衡器包装Eureka,以提供基于流量、资源使用、错误条件等因素的加权负载平衡,从而提供更好的恢复能力。

Eureka主要实现服务发现与注册,负载均衡等。



注:github说明

https://github.com/Netflix/eureka/wiki

,Eureka2.0的开源工作已经停止,不在维护。eureka1.x是Netflix服务发现系统的核心部分,目前仍是一个活跃的项目。

项目结构

项目实例地址:

https://github.com/zhixiaoWeng/springboot-wzx

搭建Eureka Server(单例模式)

引入依赖

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

启动类添加

添加@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer8080Application {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServer8080Application.class, args);
    }
}

application.yml

server:
  port: 8080

eureka:
  instance:
    hostname: eurekaServer8080
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
  application:
    name: eurekaServer8080




defaultZone属性区分大小写,并且需要驼峰大小写,因为serviceUrl属性是Map<String,String>


启动成功后:输入

http://localhost:8080/

即可查看到eureka界面

搭建Eureka Client

引入依赖

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

application.yml


eureka:
  instance:
    hostname: eurekaClient8081
  client:
    serviceUrl:
      defaultZone: http://localhost:8080/eureka/
server:
  port: 8081
spring:
  application:
    name: eurekaClient8081

启动项目成功后,即可在服务界面看见注册的客户端eurekaClient8081。

使用Eureka Client

1.注入Bean

@Bean
@LoadBalanced
RestTemplate restTemplate(){
        return new RestTemplate();
    }



注意:当RestTemplate使用带有服务名的url(



http://EUREKACLIENT8081/client8081/hello



)调用时,会出现java.net.UnknownHostException: EUREKACLIENT8081错误。restTemplate只是普通的远程调用工具,并不能将服务名转化为ip,所以需要在注入RestTemplate时添加


@LoadBalanced注解,表明


RestTemplate bean可以使用


LoadBalancerClient 作为负载均衡器。

2.调用接口

    @Autowired
    DiscoveryClient discoveryClient;
    
    @Autowired
    RestTemplate restTemplate;

    @GetMapping("getHello")
    public String getClient8081Hello(){
        List<ServiceInstance> eurekaClient8081 = discoveryClient.getInstances("eurekaClient8081");
        ServiceInstance serviceInstance = eurekaClient8081.get(0);
        String url = "http://"+serviceInstance.getServiceId()+"/client8081/hello";
        String result = restTemplate.getForObject(url, String.class);
        System.out.println(result);
        return result;
    }
注意如果DiscoveryClient无法自动注入,请导入正确的路径:import org.springframework.cloud.client.discovery.DiscoveryClient;

集群Eureka Server


官网关于集群的解释

Eureka默认是允许通过运行多个实例并让它们相互注册,使得Eureka更具弹性和可用性。只需要向其他Eureka服务端提供有效的serviceUrl就可以。

因此搭建集群只需搭建多个服务端,并向其他服务端进行地址注册就可以了

1.搭建eureka-server8083.只需在eureka.client.serviceUrl.defaultZone添加其余的EurekaServer,来实现服务端集群。

2.配置文件application.yml

server:
  port: 8083

eureka:
  instance:
    hostname: eurekaServer8083
  client:
    registerWithEureka: false #不向注册中心注册自己
    fetchRegistry: false  #不拉取服务,只维护服务实例
    serviceUrl:
      defaultZone: http://eurekaServer8083:8083/eureka/,http://eurekaServer8080:8080/eureka/

spring:
  application:
    name: eurekaServer8083

4.启动后查看

http://localhost:8083/

界面可以看见8083的服务端集成了8080的服务端。

3.Eureka Client添加到集群

客户端需要往所有的服务端进行注册。配置文件如下:


eureka:
  instance:
    hostname: eurekaClient8081
    prefer-ip-address: true
  client:
    serviceUrl:
      defaultZone: http://localhost:8080/eureka/,http://localhost:8083/eureka/
server:
  port: 8081
spring:
  application:
    name: eurekaClient8081

4.测试集群

此时eurekaClient8081客户端在服务端8080和8083都进行了注册,此时,关闭8080服务端,使用eurekaClient8082调用eurekaClient8081的服务,能够正常调用。

客户端向服务端注册时偏向于IP地址

将eureka.instance.preferIpAddress设置为true时,表示当客户端向服务端注册时使用的是ip地址,而不是主机名称。

如何保护Eureka服务端

服务端只需要添加spring-boot-starter-security依赖,并忽略/Eureka/**端点。注:Spring Security需要每个向应用的请求发送一个有效的CSRF令牌,Eureka客户端通常不会有这个令牌,因此需要如下配置:

@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().ignoringAntMatchers("/eureka/**");
        super.configure(http);
    }
}

支持JDK 11

Eureka服务器所依赖的JAXB模块在JDK 11中被删除。如果Eureka Server需要运行在JDK11上,只需要在Pom文件中包含如下依赖:

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
</dependency>

健康检查:

默认情况下,Eureka使用客户端的心跳来确定客户端是否是正常的。

默认健康检查是开启的,eureka.client.healthcheck.enabled=true,在客户端成功注册之后,定时向服务端发送健康状态。客户端默认每隔30s像服务端发送心跳信号,如果在90s内没有接收到心跳信号,服务端会认为客户端挂掉,将会从服务商删除客户端实例。

可以查看org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean中的解释。

关闭Eureka客户端刷新

默认情况下,eureka客户端是可以刷新的,意味着,可以客户端的属性是可以修改和刷新的。不过在刷新发生的时候,客户端从服务端注销,并且可能在短时间内导致注册的实例不能够使用,此时需要关闭客户端的刷新行为。

eureka.client.refresh.enable=false

Eureka自我保护机制

频繁下线实例可能会导致服务端界面显示红色字样,代表触发了eureka的自我保护机制。

查看eureka服务端默认配置,是开启自我保护机制的。


查看com.netflix.eureka.DefaultEurekaServerConfig中关于自我保护的描述。当自我保护开启时,服务将会跟踪从服务器接收客户端续订的次数,单位时间内续订数量的百分比低于0.85时,就会触发自我保护机制,帮助服务器保留注册信息,防止因为网路问题导致客户端与服务端之间没能正常通信的问题。

官方文档中显示,客户端如果要在服务端正常注销,需要显示的执行shutdown()方法,任何连续3次心跳更新失败的客户端都将被视为不正常的终止。

Eureka常用属性介绍

eureka.client.eureka-connection-idle-timeout-seconds:默认30秒,表示http连接到Eureka服务端在关闭之前可以保持空闲的时间,建议30秒甚至更短,因为防火墙会在几分钟内清除连接信息,使连接挂起。

eureka.client.eureka-server-connect-timeout-seconds:默认5秒,表明在连接到服务端的超时时间,时间的设置会影响连接的创建以及从连接池获取连接的等待时间。

eureka.client.register-with-eureka:默认true,表示是否需要将实例注册到eureka服务端中。

eureka.client.fetch-registry:默认true,客户端是否应该从服务端拉取注册信息。

eureka.client.eureka-server-total-connections:默认200,允许连接到服务端的所有实例的数量。

eureka.client.eureka-server-read-timeout-seconds:默认8秒,表明从eureka服务端阅读等待超时时间。

eureka.client.eureka-server-total-connections-per-host::默认50,允许客户端连接到服务端主机的总数。

eureka.client.eureka-service-url-poll-interval-seconds:默认0,客户端轮询eureka服务器信息更改的频率(秒),

eureka.client.prefer-same-zone-eureka:默认true,当实例由于延迟或者其他原因,向服务器发起请求时是否优先尝试同一个区域内的服务器。

ribbon.eureka.enabled:默认true,eureka默认开始ribbon。

spring.cloud.loadbalancer.eureka.approximate-zone-from-hostname:默认false,用于确定是否应该尝试从主机名获取区域值。



版权声明:本文为qq_39099625原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。