SpringCloud------Eureka修改实例显示信息、服务发现Discovery、自我保护(六)

SpringCloud------Eureka修改实例显示信息、服务发现Discovery、自我保护(六)

1.actuator微服务信息完善
2.服务发现Discovery
3.Eureka自我保护

actuator微服务信息完善

web和actuator依赖用于图形化监控

1.主机名称:服务名称修改

新增:instance-id

eureka:
  client:
    register-with-eureka: true # 表示是否将自己注册进EurekaServer默认为true
    # 是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须为true,才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      #defaultZone: http://localhost:7001/eureka
      #defaultZone: http://eureka7001.com/7001/eureka,http://eureka7002.com/7002/eureka
      defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka
  instance:
    instance-id: payment8001 #8002的改为payment8002

修改完重启后:
在这里插入图片描述
在这里插入图片描述

健康检查

点击对应的服务名
会进入对应的地址:

http://01za3zd23001166.corp.haier.com:8001/actuator/info

改为health:

http://01za3zd23001166.corp.haier.com:8001/actuator/health

会打印出:
{“status”:“UP”}

2.访问信息有IP信息提示

  instance:
    instance-id: payment8001
    prefer-ip-address: true  # 访问路径可以显示IP地址

如图所示
在这里插入图片描述

服务发现Discovery

对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息。
对于服务提供者Controller进行改造
新增如下代码:

import org.springframework.cloud.client.discovery.DiscoveryClient;

    @Resource
    private DiscoveryClient discoveryClient;

    @GetMapping("/discovery")
    public Object discovery(){
        /**
         * 获取服务清单列表
         */
        List<String> services = discoveryClient.getServices();
        for (String element:services){
            log.info("***element:*"+element);
        }
        /**
         * 服务名,获取这个服务下多个实例
         */
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance:instances){
        // 实例id/实例IP/实例端口/实例的url
            log.info(instance.getInstanceId() +"。"+instance.getHost()+"。"+instance.getPort()+"。"+instance.getUri());
        }
        return this.discoveryClient;
    }

接下来在对生产者的启动类新增 @EnableDiscoveryClient注解

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class PaymentMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8001.class,args);
    }
}

调用该接口测试效果如图:
在这里插入图片描述
返回结果:

{
“services”: [
“cloud-payment-service”,
“cloud-consumer-service”
],
“order”: 0
}

Eureka自我保护

保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。

一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。

如果Eureka Serve页面中看到如下信息,说明Eureka进入了保护模式:
在这里插入图片描述

意思是:

某一时刻某个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存。
属于CAP理论中的AP分支

设计原因:
为了防止Client可以正常运行,但是Eureka Server网络不通情况下,Eureka Server不会立刻将Client服务剔除。

默认时间是90s
简单地说就是防止因为网络原因,错误注销正常的服务。
宁可保护错误的服务注册信息,也不盲目注销任何可能健康的服务实例

如何禁止自我保护

修改注册端的配置

默认开启自我保护

eureka.server.enable-self-preservation: true 默认为true开启
eviction-interval-timer-in-ms: 2000 # 心跳时间改为2s,2000毫秒

改为false即可禁止自我保护。

eureka:
  client:
    register-with-eureka: true # 表示是否将自己注册进EurekaServer默认为true
    # 是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须为true,才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
    #defaultZone: http://localhost:7001/eureka
      #defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
      defaultZone: http://localhost:7001/eureka
      # ,http://localhost:7002/eureka
  server:
    enable-self-preservation: false  # 禁用自我保护
    eviction-interval-timer-in-ms: 2000 # 心跳时间改为2s,2000毫秒
客户端同样可以修改发送心跳时间间隔

lease-renewal-interval-in-seconds: 10 #默认为30s,发送一次心跳, 修改客户端向服务器端发送心跳的时间间隔,单位为秒
lease-expiration-duration-in-seconds: 2 #eureka服务器端在收到最后一次心跳后等待时间的上线,单位为秒,默认为90s
# 超时将剔除服务

eureka:
  client:
    register-with-eureka: true # 表示是否将自己注册进EurekaServer默认为true
    # 是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须为true,才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      #defaultZone: http://localhost:7001/eureka
      #defaultZone: http://eureka7001.com/7001/eureka,http://eureka7002.com/7002/eureka
      defaultZone: http://localhost:7001/eureka
      # ,http://localhost:7002/eureka
  instance:
    instance-id: payment8001
    prefer-ip-address: true  # 访问路径可以显示IP地址
    lease-renewal-interval-in-seconds: 1  #默认为30s,发送一次心跳,   修改客户端向服务器端发送心跳的时间间隔,单位为秒
    lease-expiration-duration-in-seconds: 2 #eureka服务器端在收到最后一次心跳后等待时间的上限,单位为秒,默认为90s
    # 超时将剔除服务

以上是Eureka的全部内容。

Eureka停更后怎么办?

切换其他的注册中心,或者继续使用。
目前是停更不停用的阶段。

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

2.0以后就不再更新
1.x依然是一个活动的工程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Gateway中,可以通过配置Route来将请求路由到对应的服务上。在配置Route时,可以使用Eureka中的服务名作为目标服务的标识符,但是需要注意的是,Eureka中的服务名只是一个逻辑名字,并不是具体的IP地址和端口号。 如果要从Eureka中动态获取目标IP地址和端口信息,可以使用Spring CloudDiscoveryClient来获取服务实例信息。在获取到实例信息后,可以通过Feign的@FeignClient注解配置URL,从而实现对目标服务的调用。具体的步骤如下: 1. 引入Spring Cloud Eureka和Feign的依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` 2. 在Spring Cloud Gateway中配置Route,使用服务名作为目标服务的标识符: ```yaml spring: cloud: gateway: routes: - id: service-a-route uri: lb://service-a predicates: - Path=/service-a/** ``` 3. 在Feign的@FeignClient注解中配置URL,使用DiscoveryClient获取服务实例信息并构造URL: ```java @FeignClient(name = "service-a", url = "${service-a.url}") public interface ServiceAClient { // ... } @Configuration public class ServiceAConfiguration { private final DiscoveryClient discoveryClient; public ServiceAConfiguration(DiscoveryClient discoveryClient) { this.discoveryClient = discoveryClient; } @Bean public ServiceInstanceListSupplier serviceInstanceListSupplier() { return ServiceInstanceListSupplier.builder() .withDiscoveryClient(discoveryClient) .withServiceName("service-a") .build(); } @Bean public IRule ribbonRule() { return new WeightedResponseTimeRule(); } @Bean @ConditionalOnMissingBean public RestClient restClient(RibbonClientFactory ribbonClientFactory) { return new RibbonRestClient(ribbonClientFactory); } @Bean @ConditionalOnMissingBean public RibbonLoadBalancerContext ribbonLoadBalancerContext(SpringClientFactory clientFactory) { return clientFactory.getLoadBalancerContext("default"); } @Bean @ConditionalOnMissingBean public SpringClientFactory clientFactory() { return new SpringClientFactory(); } @Bean public LoadBalancerProperties loadBalancerProperties() { return new LoadBalancerProperties(); } @Bean public Request.Options options() { return new Request.Options(5000, 5000); } @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } @Bean public Decoder decoder() { return new JacksonDecoder(); } @Bean public Encoder encoder() { return new JacksonEncoder(); } @Bean public Retryer retryer() { return new Retryer.Default(); } @Bean public Contract contract() { return new SpringMvcContract(); } @Value("${service-a.port}") private Integer port; @Value("${service-a.context-path}") private String contextPath; @Bean public String serviceAUrl() { ServiceInstance instance = discoveryClient.getInstances("service-a").get(0); String host = instance.getHost(); String url = String.format("http://%s:%d/%s", host, port, contextPath); return url; } } ``` 在上述代码中,我们首先通过DiscoveryClient获取服务实例信息,然后根据实例信息构造URL,并将URL注入到Feign的@FeignClient注解中。需要注意的是,在配置Feign的时候,需要手动构造一些Bean,例如ServiceInstanceListSupplier、IRule等,以便让Feign能够正确地调用目标服务

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值