SpringCloud服务治理-Eureka

什么是Eureka?

Eureka是Springcloud提供的服务注册与发现组件,它的主要功能是提供一个注册中心来为各个微服务之间的相互调用提供便捷

Eureka的角色组成

Eureka组件包含两个角色,分别是Eureka Server和Eureka Client。

  • Eureka Server:Client微服务启动后,在Eureka Server中进行注册,Eureka Server通过一个注册表来存储微服务的相关信息
  • Eureka Client:Client微服务启动后,向Eureka Server发送心跳(默认为30秒),如果Eureka Server在多个心跳周期内(默认为90秒)没有收到该Client发送的心跳信息,将会在注册表中剔除该服务,默认配置信息如下:
  instance:
    # Eureka客户端向服务端发送心跳的时间间隔,默认为30秒
    lease-renewal-interval-in-seconds: 30
    # Eureka客户端在接收到客户端最后一次心跳后等待时间(超时将剔除服务)
    lease-expiration-duration-in-seconds: 90

创建Eureka Server服务

1.在项目中添加依赖

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

2.配置启动类,在启动类上添加@EnableEurekaServer注解

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

3.添加yaml配置

server:
  port: 7001
spring:
  application:
    name: eureka-server
eureka:
  instance:
    # eureka服务端的实例名称
    hostname: localhost
  client:
    # false表示不向服务端注册自己
    register-with-eureka: false
    # false表示不需要检索服务,因为自己就是注册中心
    fetch-registry: false
    # client端向服务端发起注册的地址
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

4.启动服务,访问注册中心地址,效果如下


image.png

创建Eureka Client服务

1.在项目中添加依赖

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

2.配置启动类,在启动类上添加@EnableEurekaClient注解

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

3.添加yml配置

server:
  port: 7002
spring:
  application:
    name: eureka-client
eureka:
  instance:
    hostname: loclhost
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka/

4.启动服务,访问注册中心地址,效果如下


image.png

可以看到客户端服务已经注册成功

自我保护机制

在上面的图示中,我们可以看到有一长串的红色字体,这表示Eureka开启了自我保护机制

EurekaServer将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何服务

为什么需要自我保护

因为微服务是分布部署的,不同的微服务可能部署在不同的机器上,如果微服务本身是正常的,但是由于机器之间的网络故障导致了该服务与EurakaServer之间不能正常通信,所以当EurakaSever节点在短时间内丢失过多的客户端连接时,就会进入自我保护模式,不会立即剔除服务
所以,自我保护机制实际上是作用于网络容错的

如何关闭自我保护机制

在EurekaSever的配置中添加如下配置
application.yml

  server:
    # 默认开启了自我保护机制,设置为false表示关闭
    enable-self-preservation: false
    # 剔除服务的时间
    eviction-interval-timer-in-ms: 2000

关闭后效果展示


image.png

说明自我保护模式已经关闭

Eureka集群

为什么要搭建Eureka集群

搭建Eureka集群的目的是为了实现负载均衡和故障容错,以达到高可用的效果

如何搭建Eureka集群

集群原理:相互注册
集群搭建:
1.按照创建Eureka Server服务的方式创建多个Eureka Server服务
比如:创建三个EurekaServer服务:EurekaServer-7001、EurekaServer-7002、EurekaServer-7003
2.其余步骤没有任何变化,只需要更改yml中的Eureka部分的配置即可

EurekaServer-7001的Eureka部分的配置

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7002/eureka/,http://localhost:7003/eureka/

EurekaServer-7002的Eureka部分的配置

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka/,http://localhost:7003/eureka/

EurekaServer-7003的Eureka部分的配置

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/

启动上面的三个EurekaServer服务,Eureka集群就已经运行起来了

其他微服务注册到Eureka集群

因为要将服务注册到Eureka集群,所以EurekaClient的地址就必须指向集群的地址
yml中Eureka的地址配置如下:

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/

即同时指定多个EurekaServer的地址,每个地址之间用,分隔

集群的负载均衡

在Eureka集群搭建的时候,说过Eureka集群能够实现服务的负载均衡,那么具体如何实现呢?
首先要实现负载均衡至少需要两个条件:
1.需要一个集群对外提供服务
2.需要一种负载均衡机制来选择去集群中的哪一台机器上去获取服务


集群准备:
创建一个服务提供者,并改动端口,启动多个服务

image.png

方法如上图所示,编辑配置项
1.点击左侧的+,添加一个服务
2.给服务区一个名字,指定主启动类,添加VM参数指定端口
3.启动该服务
启动完成后,去注册中心查看服务
image.png

可以看到一个服务名称对应了多个服务地址
服务提供者代码
Application.java

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

ProviderController.java

@RestController
@RequestMapping("provider")
public class ProviderController {
    @Value("${server.port}")
    private String port;
    @GetMapping("port")
    public String getPort(){
        return port;
    }
}

application.yml

server:
  port: 8001
spring:
  application:
    name: sword-provider
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/

负载均衡机制准备:
创建一个服务消费者,来消费Provider提供的服务
ConsumerApplication.java

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

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

使用@Bean注解声明一个RestTemplate的bean,并在该bean上添加了@LoadBalanced注解,该注解默认提供了轮询机制的负载均衡算法
ConsumerController.java

@RestController
@RequestMapping("consumer")
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;
    private String Url="http://sword-provider";
    @GetMapping("port")
    public String getPort(){
        return restTemplate.getForObject(Url+"/provider/port",String.class);
    }
}

使用template调用远程服务,可以看到远程服务的url地址指向的是Provider的服务名
application.yml

server:
  port: 9001
spring:
  application:
    name: sword-consumer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
    register-with-eureka: true
    fetch-registry: true

启动consumer服务,并访问接口:http://localhost:9001/consumer/port
多次刷新该接口,可以看到页面的返回值在8001和8002之间来回切换,说明消费者服务在访问的服务提供者的时候,请求了不同的服务提供者,说明负载均衡效果达到

actuator完善服务信息

actuator的作用主要有两个:主机名修改、访问信息提供ip提示
依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

主机名修改

在euraka的配置信息中添加instance-id配置

  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
    register-with-eureka: true
    fetch-registry: true
  # 添加instance-id配置,以修改注册信息中显示的主机名
  instance:
    instance-id: sword-consumer-9001
image.png

可以看到主机名称已经改变
通过接口查看微服务的状态


image.png

显示ip地址提示

  instance:
    instance-id: sword-consumer-9001
    # 添加ip地址显示
    prefer-ip-address: true
image.png

服务发现Descovery

功能:对于注册进注册中心的微服务,可以通过服务发现来获得该服务的信息
在服务提供者微服务的controller中添加如下代码:
Controller.java

    @Resource
    private DiscoveryClient discoveryClient;
    @GetMapping("services")
    public List<ServiceInstance> getServices(){
        //获取服务名称列表
        List<String> services = discoveryClient.getServices();
        for (String s:services){
            System.out.println("--item:"+s);
        }
        //获取服务实例信息
        List<ServiceInstance> instances = discoveryClient.getInstances("SWORD-PROVIDER");
        return instances;
    }

在主启动类上添加@EnableDiscoveryClient注解

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

启动程序,并访问http://localhost:8001/provider/services,就可以获得服务的相关信息

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352