Spring-Cloud服务发现Eureka的使用教程

Spring-Cloud服务发现Eureka的使用教程

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一。
服务中心
服务中心又称注册中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。

有了服务中心调用关系会有什么变化,画几个简图来帮忙理解

项目A调用项目B

正常调用项目A请求项目B
在这里插入图片描述
有了服务中心之后,任何一个服务都不能直接去掉用,都需要通过服务中心来调用
在这里插入图片描述
项目A调用项目B,项目B在调用项目C
在这里插入图片描述
在这里插入图片描述

Netflix
Netflix是一家美国公司,在美国、加拿大提供互联网随选流媒体播放,定制DVD、蓝光光碟在线出租业务。该公司成立于1997年,总部位于加利福尼亚州洛斯盖图,1999年开始订阅服务。2009年,该公司可提供多达10万部DVD电影,并有1千万的订户。2007年2月25日,Netflix宣布已经售出第10亿份DVD。HIS一份报告中表示,2011年Netflix网络电影销量占据美国用户在线电影总销量的45%。
Netflix的开源框架组件已经在Netflix的大规模分布式微服务环境中经过多年的生产实战验证,正逐步被社区接受为构造微服务框架的标准组件。Spring Cloud开源产品,主要是基于对Netflix开源组件的进一步封装,方便Spring开发人员构建微服务基础框架。对于一些打算构建微服务框架体系的公司来说,充分利用或参考借鉴Netflix的开源微服务组件(或Spring Cloud),在此基础上进行必要的企业定制,无疑是通向微服务架构的捷径。

Eureka
按照官方介绍:
Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS cloud for locating services for the purpose of load balancing and failover of middle-tier servers.

Eureka 是一个基于 REST 的服务,主要在 AWS 云中使用, 定位服务来进行中间层服务器的负载均衡和故障转移。
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
用一张图来认识以下:
在这里插入图片描述
上图简要描述了Eureka的基本架构,由3个角色组成:
1、Eureka Server
提供服务注册和发现,eurekaServer中的服务注册表中将会存储所有可用服务节点的信息
2、Service Provider
服务提供方
将自身服务注册到Eureka,从而使服务消费方能够找到
3、Service Consumer
服务消费方
从Eureka获取注册服务列表,从而能够消费服务
创建Eureka项目模块
单节点Eureka部署使用
spring cloud已经帮我实现了服务注册中心,我们只需要很简单的几个步骤就可以完成。
1、pom中添加依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter</artifactId>
    </dependency>
        <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <--最新版本->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

2、添加启动代码中添加@EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudEurekaApplication.class, args);
    }
}

3、配置文件
在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,在application.properties添加以下配置:

server.port=7001
spring.application.name=spring-cloud-eureka
eureka.instance.hostName=localhost  # eureka服务端的实例名称
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

eureka.client.register-with-eureka :表示是否将自己注册到Eureka Server,默认为false。
eureka.client.fetch-registry :表示是否从Eureka Server获取注册信息,默认为false。
eureka.client.serviceUrl.defaultZone :设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。
启动工程后,访问:http://localhost:7001/,可以看到下面的页面,其中还没有发现任何服务
在这里插入图片描述
提供者
在需要把服务注册到eureka服务中的其他的服务提供者添加相应内容,然后重启就会把服务注册到eureka中
主启动类添加以下注解

@EnableEurekaClient

yml配置文件:

server-port: 8001
spring.application.name=spring-cloud-eureka 
eureka.client.register-with-eureka=true 
eureka.client.fetch-registry=true
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
# localhost:${server.port}代表eureka的服务端的地址和端口号
#修改主机名称或者服务名称
eureka.instance-instance-id: 新的服务名称
eureka.instance-prefer-ip-address: true #访问路径可以显示ip地址
# 微服务info内容详细信息,解读父工程添加的build信息
info-app.name: atguigu-microservicecloud
info-build.artifactId: $project.artifactId$
info-company.name: www.atguigu.com
info-build.version: $project.version$

pom文件添加依赖:

// 微服务info内容详细信息,并且在总的父工程添加build信息
 <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

 <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-config</artifactId>
    </dependency>

消费者
在eureka客户端需要把服务注册到eureka服务中的其他的服务消费者添加相应内容,然后重启就会把服务注册到eureka中
pom文件添加依赖:

// 微服务info内容详细信息,并且在总的父工程添加build信息
 <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

 <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-config</artifactId>
    </dependency>

yml配置文件:

server-port: 80
spring.application.name=spring-cloud-eureka #需要和eureka服务中心的名称一致
eureka.client.register-with-eureka=true 
eureka.client.fetch-registry=true
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
# localhost:${server.port}代表eureka的服务端的地址和端口号
#修改主机名称或者服务名称
eureka.instance-instance-id: 新的服务名称
eureka.instance-prefer-ip-address: true #访问路径可以显示ip地址
# 微服务info内容详细信息,解读父工程添加的build信息
info-app.name: atguigu-microservicecloud
info-build.artifactId: $project.artifactId$
info-company.name: www.atguigu.com
info-build.version: $project.version$

主启动类添加以下注解

@EnableEurekaClient

通过RestTemplate注册调用服务提供者,最后依次进行重启测试就可以了

集群搭建

注册中心这么关键的服务,如果是单点话,遇到故障就是毁灭性的。在一个分布式系统中,服务注册中心是最重要的基础部分,理应随时处于可以提供服务的状态。为了维持其可用性,使用集群是很好的解决方案。Eureka通过互相注册的方式来实现高可用的部署,所以我们只需要将Eureke Server配置其他可用的serviceUrl就能实现高可用部署

双节点EurekaService部署使用
首次我们尝试一下双节点的注册中心的搭建(相互注册)。
1、创建application-peer1.properties,作为peer1服务中心的配置,并将serviceUrl指向peer2

server.port=7001
spring.application.name=spring-cloud-eureka 
eureka.instance.hostname=peer1 #Eureka服务端实例名称
eureka.client.register-with-eureka=false 
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://peer2:7002/eureka/

2、创建application-peer2.properties,作为peer2服务中心的配置,并将serviceUrl指向peer1

spring.application.name=spring-cloud-eureka
server.port=7002
eureka.instance.hostname=peer2 #Eureka服务端实例名称
eureka.client.serviceUrl.defaultZone=http://peer1:7001/eureka/

3、host转换
在c:\windows\systems32\drivers\etc\hosts文件中加入如下配置

127.0.0.1 peer1  
127.0.0.1 peer2  

4.两个节点eurekaServer主启动类上都添加注解@EnableEurekaServer
5.在eureka端口号8001提供者和端口号80消费者客户端修改配置文件下内容为

eureka.client.serviceUrl.defaultZone=http://peer1:端口/eureka/,http://peer2:端口/eureka/,

6、打包启动,依次执行下面命令`

#打包
mvn clean package
# 分别以peer1和peeer2 配置信息启动eureka
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

依次启动完成后,浏览器输入:http://localhost:7001/ 效果图如下
在这里插入图片描述
根据图可以看出peer1的注册中心DS Replicas已经有了peer2的相关配置信息,并且出现在available-replicas中。我们手动停止peer2来观察,发现peer2就会移动到unavailable-replicas一栏中,表示peer2不可用。
到此双节点的配置已经完成。

多节点Eureka部署使用
在生产中我们可能需要三台或者大于三台的注册中心来保证服务的稳定性,配置的原理其实都一样,将注册中心分别指向其它的注册中心。这里只介绍三台集群的配置情况,其实和双节点的注册中心类似,每台注册中心分别又指向其它两个节点即可,使用application.yml来配置。

application.yml配置详情如下:

spring:
  application:
    name: spring-cloud-eureka
  profiles: peer1
server:
  port: 7001
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2:7002/eureka/,http://peer3:7003/eureka/
---
spring:
  application:
    name: spring-cloud-eureka
  profiles: peer2
server:
  port: 7002
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1:7001/eureka/,http://peer3:7003/eureka/
---
spring:
  application:
    name: spring-cloud-eureka
  profiles: peer3
server:
  port: 7003
eureka:
  instance:
    hostname: peer3
  client:
    serviceUrl:
      defaultZone: http://peer1:7001/eureka/,http://peer2:7002/eureka/

分别以peer1、peer2、peer3的配置参数启动eureka注册中心。

java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer3

依次启动完成后,浏览器输入:http://localhost:7001/ 效果图如下:
在这里插入图片描述

服务发现Discovery

1.修改服务提供者Controller类添加:

@Resource
private DiscoveryClient discoveryClient;
@GetMapping(value = "/discovery")
public Object discovery(){
// 获取服务列表信息
List<String> service = discoveryClient.getServices();
// 或者根据微服务名称获取微服务内容
List<ServiceInstance> service = discoveryClient.getInstances("微服务名称");
}

修改主启动类添加以下注解

@EnableDiscoveryClient

最后依次重启测试

Eureka服务保护机制

1.修改Eureka服务端7001配置文件

# 关闭自我保护机制
eureka.server.enable-self-preservation=false
eureka.server.eviction-interval-timer-in-ms=2000

2.修改服务提供者8001配置文件

# eureka客户端想服务端发送心跳的时间间隔
eureka.instance.lease-renewal-interval-in-seconds=1 #单位为秒(默认30)
# eureka服务端在收到最后一次心跳等待时间上限,超时讲剔除服务
eureka.instance.lease-expiration-duration-in-seconds=2#单位为秒(默认90)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值