Spring Cloud Netflix Eureka

Spring Cloud Netflix简介

Spring Cloud Netflix作为Spring Cloud 组件的核心部分,其强大的功能也是微服务实现的基础

在这里插入图片描述

  • Netflix Eureka:云端负载均衡,一个基于 REST 的服务,用于定位服务,以实现云端的负载均衡和中间层服务器的故障转移。

  • Netflix Hystrix:容错管理工具,旨在通过控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。

  • Netflix Zuul:边缘服务工具,是提供动态路由,监控,弹性,安全等的边缘服务。

  • Netflix Archaius:配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。

  • 负载均衡:
    客户端负载均衡——Netflix Ribbon
    服务端负载均衡:——Feign(其也是依赖于Ribbon,只是将调用方式RestTemplete 更改成Service 接口)

微服务架构面临的4个核心问题:
1. 服务很多,客户端该怎么访问?
2. 这么多服务,服务之间如何通信?
3. 这么多服务,如何治理?
4. 某个服务挂了怎么办?

Spring Cloud Netflix作为spring cloud大家族的一员就是用来解决这些问题的。

在这里插入图片描述
上图可以看出Netflix是对外暴露的服务管理者接下来就从Netflix组件开始认识微服务。

Eureka

服务注册和发现,它提供了一个服务注册中心、服务发现的客户端,还有一个方便的查看所有注册的服务的界面。 所有的服务使用Eureka的服务发现客户端来将自己注册到Eureka的服务器上。

服务发现是基于微服务的体系结构的主要宗旨之一。尝试手动配置每个客户端或某种形式的约定可能很困难并且很脆弱。Eureka是Netflix Service Discovery服务器和客户端。可以将服务器配置和部署为高可用性,每个服务器将有关已注册服务的状态复制到其他服务器。

eureka包括Eureka分为服务端组件和客户端组件:

Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在后台界面中直观的看到。

Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就别一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。

springcloud之eureka原理

其它的注册中心:

在这里插入图片描述

C:数据一致性
A:高可用性
P:分区容错性

1、Zookeeper它是⼀个分布式服务框架,是Apache Hadoop 的⼀个⼦项⽬,它主要是⽤来解决分布式应 ⽤中经常遇到的⼀些数据管理问题,如:统⼀命名服务、状态同步服务、集群管理、分布式应⽤配置项的管理等。他的本质就是存储+监听

2、Nacos是⼀个更易于构建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。简单来说 Nacos就是 注册中⼼ + 配置中⼼的组合,帮助我们解决微服务开发必会涉及到的服务注册 与发现,服务配置,服务管理等问题。Nacos 是 Spring Cloud Alibaba 核⼼组件之⼀,负责服务注册与发现,还有配置。

3、Eureka由Netflflix开源,并被Pivatal集成到SpringCloud体系中,它是基于 RestfulAPI ⻛格开发的服务注册与发现组件。

4、Consul是由HashiCorp基于Go语⾔开发的⽀持多数据中⼼分布式⾼可⽤的服务发布和注册服务软件, 采⽤Raft算法保证服务的⼀致性,且⽀持健康检查。

服务注册

服务的注册建立在注册中心之上,所以首先需要搭建注册中心。

  • 新建模块工程

每个模块是一个独立的spring boot程序。
在这里插入图片描述

  • 导入依赖

分模块开发,父模块配置故要导入版本。(eureka-server 3.1.0和spring boot 2.6.9版本不冲突)在服务端模块即eureka_server导入。

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

  • 注册配置

配置eureka实例信息,修改相关配置更好运行。

# 配置服务名称 == 注册中心server
spring.application.name=eureka_server

# 服务端口号
server.port= 9000

# 配置服务实例ip
eureka.instance.hostname=localhost



#是否将eureka注册到注册中心(本自身不注册)
eureka.client.register-with-eureka=false

#是否从eureka中获取注册地址(后台已ip显示而不是域名)
eureka.client.fetch-registry=false

# 配置eureka客户端要连接的服务端信息
eureka.client.service-url.defaultZone=http://localhost:9000/eureka/


# 注册中心实例配置

# 配置服务ip地址为localhost(默认为本机ip地址,导致本地无法访问)
eureka.instance.ip-address=localhost

# 配置后台Status显示格式
eureka.instance.instance-id=${eureka.instance.hostname}:${spring.application.name}:${server.port}

# 使用ip地址注册(默认域名)
eureka.instance.prefer-ip-address=true
  • 配置启动类

spring 的配置都依赖于IoC容器的Bean来实例化,同理eureka的配置也需要借助配置类EurekaServerAutoConfiguration。在启动程序中添加@EnableEurekaServer注解使配置生效。详情见@EnableEurekaServer

@SpringBootApplication

//eureka 启动类
@EnableEurekaServer
public class EurekaServerApplication {

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

}

在这里插入图片描述

输入:http://localhost:9000也能进入eureka后台系统

在这里插入图片描述

  • 服务注册

注册中心搭建好之后就可以将服务注册到注册中心了,首先在bill_service的pom导入服务端端依赖:

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

配置服务端相关信息:

# 配置数据源相关信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/smbms?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=root

server.port=8081

# 关联注册中心

eureka.client.service-url.defaultZone=http://localhost:9000/eureka/

# 配置eureka的状态显示

eureka.instance.hostname=localhost
eureka.instance.instance-id=${eureka.instance.hostname}:${spring.application.name}:${server.port}

# 使用ip地址注册
eureka.instance.prefer-ip-address=true

# 配置服务的名称
spring.application.name=order_service


# 配置服务ip地址
eureka.instance.ip-address=localhost

# 忽略网卡的影响
#Npcap Loopback Adapter:为忽略的网卡名称
spring.cloud.inetutils.ignored-interfaces[0]=Npcap Loopback Adapte

另一个模块配置一致,最后启动,需要在启动类上添加eureka客户端的启动类@EnableDiscoveryClient或者@EnableEurekaClient

@SpringBootApplication
@EnableDiscoveryClient
public class BillServiceApplication {

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

}

启动注册中心和服务即可:

在这里插入图片描述

在这里插入图片描述

Eureka Server: 提供服务发现的能力,各个微服务启动时,会向Eureka Server注册信息,比如ip、端口、微服务名称等。 Eureka Server会存储这些信息
Eureka Client: Java 客户端,用于简化与Eureka Server的交互微服务启动后,会周期性(默认30S)向Eureka Server发送心跳以续约自己的“租期”
如果Eureka Server在一定时间内(默认90S)没有接收到某个微服务实例的心跳,Eureka Server将注销该实例。默认情况下,Eureka Server 同时也是 Eureka Client . 多个Eureka Server之间通过复制的方式来实现服务注册表中数据的同步
Eureka Client会缓存服务注册表中的信息,两个好处 第一,微服务无需每次都请求查询Eureka Server ,降低Server的压力。 第二,即使Eureka Server所有节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者并完成调用。

服务调用

首先确认服务本身没有问题,编写api接口,dao,pojo,service,controller等:

@RestController
@RequestMapping(value = "/provider")
public class ProviderController {
    @Autowired
    ProviderService providerService;

    @GetMapping(value = "/{id}")
    ProviderMessage getById(@PathVariable int id){
        ProviderMessage byId = providerService.getById(id);
        return byId;
    }
}

在这里插入图片描述
服务没问题后就可以进行模块的调用了,模拟其他服务调用这两个服务的过程,首先必须明白在服务的代码中不允许高耦合型,也是就是不能出现http地址的类似代码。通过微服务的ServiceInstance对象可以获取服务实例,而服务实例又包含了该服务的相关信息,因此服务测试模块也需要注册到注册中心。另外,RestTemaplte对象可以从代码中访问api接口并获取实例对象。

新建测试模块:

在这里插入图片描述
将测试模块注册到注册中心(通过配置完成):

# 服务注册到注册中心

# 服务名称
spring.application.name=test_module

# 关联注册中心地址
eureka.client.service-url.defaultZone=http://localhost:9000/eureka/

# 配置服务端口
server.port=8083

# 配置实例主机名级相关信息
eureka.instance.hostname=localhost
eureka.instance.instance-id=${eureka.instance.hostname}:${spring.application.name}:${server.port}

# 是否使用ip注册
eureka.instance.prefer-ip-address=true

# 配置服务端ip地址
eureka.instance.ip-address=localhost

# 忽略多网卡对网卡的影响
spring.cloud.inetutils.ignored-interfaces[0]=Npcap Loopback Adapter

配置作为客户端的模块并启动客户端注解@EnableEurekaClient实现,注入RestTempalte对象

@SpringBootApplication
@EnableEurekaClient
public class TestModuleApplication {

    //java代码访问url获取返回值的对象
    @Bean
    public RestTemplate getRestTemplate(){ return new RestTemplate(); }

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

}

注意被调用的服务所有的java bean对象在测试服务也需要新建,如在bill_service服务中又两个对象:

在这里插入图片描述
那么在测试模块中返回值用到了这两个对象,所以也需要新建。

最后编写测试模块的api接口:

@RestController
@RequestMapping(value = "/test")
public class TestController {

    //获取服务中心实例
    @Autowired
    private DiscoveryClient discoveryClient;

    //java代码访问api接口的实例对象
    @Autowired
    private RestTemplate restTemplate;

    //bill_service的调用
    @GetMapping(value = "/bill/{id}")
    public BillMessage testMethod1(@PathVariable Integer id){
        List<ServiceInstance> bill_service = discoveryClient.getInstances("bill_service");
        //该服务只有一个
        ServiceInstance instance = bill_service.get(0);

        BillMessage billMessage = restTemplate.getForObject(instance.getUri() + "/bill/" + id, BillMessage.class);
        return billMessage;
    }
}

启动所有服务:
在这里插入图片描述
在测试模块调用bill_service服务:http://localhost:8083/test/bill/1
在这里插入图片描述
调用成功!微服务的注册与调用已基本完成、当前环境下需要什么服务就构建然后注册到注册中心就可以了,例如需要一个role_service则构建一个role_service的服务,通过配置注册到注册中心,通过@EnableEurekaClient获取服务,通过RestTemplate在java代码调用服务。

多注册中心

从上面的例子可以看出只有一个注册中心是很不安全的,因为它承担者非常重要的功能。所以一般都有多个注册中心。

本地模拟多注册中心:

复制eureka_server模块,更改配置文件
在这里插入图片描述
将其他注册中兴的地址配置到每个注册中心,该部分是多注册中心的核心:

# 配置eureka客户端要连接的服务端信息
eureka.client.service-url.defaultZone=http://localhost:9000/eureka/,http://localhost:7000/eureka/,http://localhost:8000/eureka/

每个注册中心可以分布式部署,这样就增加了多台注册中心,提高了生产力和稳定性。

在之前的注册中心,其本身并没有自己注册,后台也看不到且获取不到注册中心的信息,多注册中心模式需要将自生注册,修改相关配置:

# 将本身注册到注册中心
eureka.client.register-with-eureka=true

如下开启自己注册到注册中心后的服务:

在这里插入图片描述

在相互注册二时也是遇到了一个问题:Eureka相互注册,只显示对方或只在一个中显示问题

相互注册完成后,注册中心模拟分布式就搭建完成了:
在这里插入图片描述

在这里插入图片描述

eureka在将自我注册时需要配置两个选项eureka.client.service-url.defaultZone追加自己路径,eureka.client.register-with-eureka=true开启自我注册。

eureka.client.service-url配置选项是指定eureka服务端的注册地址 ,这个是客户端使用的,告诉客户端服务端的地址,声明注册地址

相互注册主要依赖配置文件完成,两个eureka_server的配置文件如下:

# 配置服务名称 == 注册中心server
spring.application.name=eureka_server_copy

# 服务端口号
server.port=7000

# 配置服务实例ip
eureka.instance.hostname=machine2



#是否将eureka注册到注册中心(本自身注册)

eureka.client.register-with-eureka=true

#是否从eureka中获取注册地址(后台已ip显示而不是域名)
eureka.client.fetch-registry=false

# 配置eureka客户端要连接的服务端信息
eureka.client.service-url.defaultZone=http://127.0.0.1:9000/eureka/,http://127.0.0.1:7000/eureka/

# 注册中心实例配置

# 配置服务ip地址为localhost(默认为本机ip地址,导致本地无法访问)
eureka.instance.ip-address=localhost

# 配置后台Status显示格式
eureka.instance.instance-id=${eureka.instance.hostname}:${spring.application.name}:${server.port}

# 使用ip地址注册(默认域名)
eureka.instance.prefer-ip-address=true

# 配置服务名称 == 注册中心server
spring.application.name=eureka_server

# 服务端口号
server.port=9000

# 配置服务实例ip
eureka.instance.hostname=machine1



#是否将eureka注册到注册中心(本自身注册)

# 将本身注册到注册中心
eureka.client.register-with-eureka=true

#是否从eureka中获取注册地址(后台已ip显示而不是域名)
eureka.client.fetch-registry=false

# 配置eureka客户端要连接的服务端信息
eureka.client.service-url.defaultZone=http://127.0.0.1:7000/eureka/,http://127.0.0.1:9000/eureka/


# 注册中心实例配置

# 配置服务ip地址为localhost(默认为本机ip地址,导致本地无法访问)
eureka.instance.ip-address=localhost

# 配置后台Status显示格式
eureka.instance.instance-id=${eureka.instance.hostname}:${spring.application.name}:${server.port}

# 使用ip地址注册(默认域名)
eureka.instance.prefer-ip-address=true

服务同步

对于有多个注册中心的微服务,各个服务注册到注册中心时,这些服务如何在多注册中心上同步呢?

启动两台注册中心:

在这里插入图片描述
启动一个服务bill_service该服务未进行任何修改,启动后刷新后台页面发现,两台服务器之间竟然自动同步了:

在这里插入图片描述

在这里插入图片描述

两个注册中心都有bill的服务,eureka注册的服务信息是自动同步的

程序的bill服务的配置,是之注册到9000这个端口的,也就是该地址下的系统自动同步到了7000端口下的服务,同时服务注册也是只注册到9000端口的:

# 关联注册中心地址
eureka.client.service-url.defaultZone=http://localhost:9000/eureka/

这样的依赖性是很强的,服务都依赖于9000端口的服务,所以一般都将服务注册到所有的注册中心,步骤也很简单,只需要在服务端注册地址中追加其他注册中心的地址即可。

对于provider_service注册地址配置如下:

eureka.client.service-url.defaultZone=http://localhost:9000/eureka/,http://localhost:7000/eureka/

启动服务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注册中心之间仍然同步服务的注册信息,效果是一样的,而且这样没有依赖的约束避免了主注册节点的影响。

配置文件可修改eureka的很多设置,如后台Status的显示格式,ip显示,服务续约等都是通过配置文件直接修改的。

Eureka服务器原理

Spring Cloud 集成了Netflix OSS的多个项目,形成了spring-cloud-netflix项目。该项目包括以下几个项目:
Alt

Eureka提供REST服务,在集群中主要用于服务器,客户端组件实现了负载均衡功能,为业务组件的集群部署创造了环境,使用框架将业务组件组测到Eureka容器,并自动维护和监控。

一个Eureka集群需要一个Eureka服务器,业务组件可以注册到Eureka服务器,其他客户端通过服务器获取服务并远程调用。

在这里插入图片描述

  • 服务器端

对于注册到服务器端的组件实例都被保存在注册中心,它们通过心跳保持状态,客户端拥有同样的机制。服务器端主要有以下工作,第一,向服务器端注册服务,第二,发送心跳给服务器,第三获取注册列表。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xvwen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值