0


【微服务】SpringCloud-eureka光速入门

🎈边走、边悟🎈迟早会好

Eureka 是 Netflix 开源的一个服务注册和发现工具,主要用于构建分布式系统中的服务发现机制。它在 Spring Cloud 生态系统中广泛使用,尤其在微服务架构中扮演重要角色。

一、Eureka 主要组件

  1. Eureka Server:- 作为服务注册中心,负责管理服务实例的注册和心跳检测。- 服务实例在启动时向 Eureka Server 注册,并定期发送心跳以保持注册信息的有效性。- Eureka Server 通常部署为集群,确保高可用性和容错性。
  2. Eureka Client:- 是注册在 Eureka Server 上的服务实例。- 它可以是任何类型的微服务应用程序,在启动时向 Eureka Server 注册并定期发送心跳。- Eureka Client 也可以从 Eureka Server 获取其他已注册服务的信息,以实现服务间的调用和负载均衡。

二、工作流程

  1. 服务注册:- 服务实例在启动时向 Eureka Server 注册其自身的元数据信息,如 IP 地址、端口号、服务名称等。
  2. 服务心跳:- 注册后,服务实例定期向 Eureka Server 发送心跳请求,以表明其仍然活跃。若在一段时间内未收到心跳,Eureka Server 将认为该实例已失效,并将其从注册列表中移除。
  3. 服务发现:- 服务调用者(客户端)通过 Eureka Server 查询可用的服务实例列表,以实现服务调用。- Eureka Client 缓存这些信息,并定期从 Eureka Server 更新,确保负载均衡和高可用性。
  4. 负载均衡:- 客户端根据从 Eureka Server 获取的服务实例列表,实现客户端负载均衡。- 常见的负载均衡策略包括轮询、随机选择、加权轮询等。

三、优势

  • 高可用性: Eureka Server 支持集群部署,确保在某些节点故障时系统仍然可用。
  • 自我保护机制: 当 Eureka Server 检测到大量客户端失效时,进入自我保护模式,避免因网络分区等原因误判服务失效。
  • 易扩展性: 新的服务实例可以动态注册和发现,支持弹性扩展。

Eureka 在 Netflix 的微服务架构中得到了广泛应用,并成为 Spring Cloud 的核心组件之一,用于实现服务注册与发现。

四、Eureka-光速入门【

  1. 重点

4.1 案例准备

4.1.1 创建父工程 tingyi-shop

pom.xml

  1. <properties>
  2. <maven.compiler.source>1.8</maven.compiler.source>
  3. <maven.compiler.target>1.8</maven.compiler.target>
  4. </properties>
  5. <packaging>pom</packaging>
  6. <parent>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-parent</artifactId>
  9. <version>2.2.8.RELEASE</version>
  10. </parent>
  11. <dependencyManagement>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.cloud</groupId>
  15. <artifactId>spring-cloud-dependencies</artifactId>
  16. <!-- 版本号是按照伦敦地铁站的名字命名的 -->
  17. <version>Hoxton.SR4</version>
  18. <type>pom</type>
  19. <scope>import</scope>
  20. </dependency>
  21. </dependencies>
  22. </dependencyManagement>
4.1.2 创建子工程 tingyi-goods

pom.xml

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. </dependencies>

引导类

  1. @SpringBootApplication
  2. public class GoodsApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(GoodsApplication.class, args);
  5. }
  6. }

application.yml

  1. server:
  2. port: 9001
  3. #指定服务的名称
  4. spring:
  5. application:
  6. name: TINGYI-GOODS

controller编写

  1. @RestController
  2. public class GoodsController {
  3. @RequestMapping("/query")
  4. public String query() {
  5. return "查询商品信息!";
  6. }
  7. }

启动并查看效果

4.1.3 创建子工程 tingyi-order

pom.xml

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. </dependencies>

引导类

  1. @SpringBootApplication
  2. public class OrderApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(OrderApplication.class,args);
  5. }
  6. }
  1. application.yml
  2. server:
  3. port: 9002
  4. #指定服务的名称
  5. spring:
  6. application:
  7. name: TINGYI-ORDER

编写controller

  1. @RestController
  2. public class OrderController {
  3. @RequestMapping("/query")
  4. public String query(){
  5. return "查询订单";
  6. }
  7. }

启动并查看效果

4.1.4 案例调整

​ 在查询订单时,同时也需要获取商品的信息,那么我们如何查询商品信息呢?

​ 我们可以通过spring为我们提供的RestTemplate 模板对象 远程调用商品模块中的 控制器。

4.1.4.1 在order模块创建 RestTemplate对象
  1. @Configuration
  2. public class RestTemplateConfig {
  3. @Bean
  4. public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
  5. return new RestTemplate(factory);
  6. }
  7. @Bean
  8. public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
  9. SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
  10. factory.setReadTimeout(5000);//ms
  11. factory.setConnectTimeout(15000);//ms
  12. return factory;
  13. }
  14. }
4.1.4.2 修改OrderController

4.1.4.2 重启并测试

4.2 为什么使用eureka

问题分析

​ 如果

  1. 被调用方

,ip或者端口号发生了变化,需要维护

  1. 调用方

的方法。

​ 如果

  1. 调用方

搭建了

  1. 集群

,需要对所有的

  1. 调用方

维护。

解决

​ Eureka就是帮助我们维护所有服务的信息,以便服务之间的相互调用

Eureka

4.2 Eureka光速入门

4.2.1 创建EurekaServer

创建eureka的server,创建moudle,并且导入依赖,在启动类中添加注解,编写yml文件

微服务名字可以叫做 tingyi

  1. -eureka

导入依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-web</artifactId>
  9. </dependency>
  10. </dependencies>

启动类添加注解

  1. @SpringBootApplication
  2. @EnableEurekaServer
  3. public class EurekaApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(EurekaApplication.class,args);
  6. }
  7. }

编写yml配置文件

  1. server:
  2. port: 8761 # 端口号
  3. spring:
  4. application:
  5. name: EUREKA-SERVER
  6. eureka:
  7. instance:
  8. hostname: localhost # localhost
  9. client:
  10. # 表示是否将自己注册到Eureka Server,默认为true
  11. registerWithEureka: false
  12. # 表示是否从Eureka Server获取注册信息,默认为true。
  13. # 因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false
  14. fetchRegistry: false
  15. # 设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
  16. serviceUrl:
  17. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

启动 eurekaServer并访问

4.2.2 调整商品模块

导入依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  4. <version>2.2.2.RELEASE</version>
  5. </dependency>

在启动类上添加注解

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. public class GoodsApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(GoodsApplication.class,args);
  6. }
  7. }

在配置文件中添加如下代码

  1. # 指定Eureka服务地址
  2. eureka:
  3. client:
  4. service-url:
  5. defaultZone: http://localhost:8761/eureka
  6. # Eureka服务中, 显示的当前search业务微服务的访问地址.
  7. instance:
  8. home-page-url: http://localhost:${server.port}

重启服务,浏览器访问地址 : http://localhost:8761

4.2.3 调整订单模块

导入依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  4. <version>2.2.2.RELEASE</version>
  5. </dependency>

在启动类上添加注解

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. public class OrderApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(OrderApplication.class,args);
  6. }
  7. }

在配置文件中添加如下代码

  1. # 指定Eureka服务地址
  2. eureka:
  3. client:
  4. service-url:
  5. defaultZone: http://localhost:8761/eureka

重启服务,浏览器访问地址 : http://localhost:8761 浏览器下方就会出现

4.2.4 调整订单模块, 调用商品模块

远程调用 订单模块controller

  1. @RestController
  2. public class OrderController {
  3. @Autowired
  4. EurekaClient eurekaClient;
  5. //自动注入RestTemplate对象
  6. @Autowired
  7. RestTemplate template;
  8. @RequestMapping("/query")
  9. public String query(){
  10. //根据Eureka上注册的服务名称获取实例对象
  11. InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka("TINGYI-GOODS", false);
  12. //获取对应模块的url
  13. String url = instanceInfo.getHomePageUrl();
  14. ResponseEntity<String> responseEntity = template.getForEntity(url + "/query", String.class);
  15. //返回结果
  16. return "查询订单" + "&" + responseEntity.getBody();
  17. }
  18. }

4.2.4 测试

与原来效果一致

4.3 Eureka的安全性

实现Eureka认证

  1. tingyi_eureka

微服务导入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>
  1. tingyi_eureka

微服务加入配置类:

  1. package com.tingyi.config;
  2. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  3. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  4. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  5. /**
  6. * @author tingyi
  7. */
  8. @EnableWebSecurity
  9. public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  10. @Override
  11. protected void configure(HttpSecurity http) throws Exception {
  12. // 忽略掉/eureka/**
  13. http.csrf().ignoringAntMatchers("/eureka/**");
  14. super.configure(http);
  15. }
  16. }
  1. tingyi_eureka

微服务编写配置文件, 加入Eureka的用户名和密码:

  1. server:
  2. port: 8761 # 端口号
  3. spring:
  4. application:
  5. name: EUREKA-SERVER
  6. # 指定Eureka的用户名和密码
  7. security:
  8. user:
  9. name: root
  10. password: root
  11. eureka:
  12. instance:
  13. hostname: localhost # localhost
  14. client:
  15. # 表示是否将自己注册到Eureka Server,默认为true
  16. registerWithEureka: false
  17. # 表示是否从Eureka Server获取注册信息,默认为true。
  18. # 因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false
  19. fetchRegistry: false
  20. # 设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
  21. serviceUrl:
  22. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

其他服务想注册到Eureka上需要添加用户名和密码

  1. eureka:
  2. client:
  3. service-url:
  4. defaultZone: http://用户名:密码@localhost:8761/eureka

4.4 Eureka的高可用

如果程序的正在运行,突然Eureka宕机了。

  • 如果调用方访问过一次被调用方了,Eureka的宕机不会影响到功能。
  • 如果调用方没有访问过被调用方,Eureka的宕机就会造成当前功能不可用。

搭建Eureka高可用

准备多台Eureka

采用了复制的方式,删除iml和target文件,并且修改pom.xml中的项目名称,再给父工程添加一个module

4.4.1 配置以及代码

让服务注册到多台Eureka, 下面是更改tingyi

  1. _order

业务微服务配置:

  1. server:
  2. port: 9001
  3. #指定服务的名称
  4. spring:
  5. application:
  6. name: tingyi-order
  7. # 指定Eureka服务地址
  8. eureka:
  9. client:
  10. service-url:
  11. defaultZone: http://root:root@EUREKA-SERVER1:8761/eureka,http://root:root@EUREKA-SERVER2:8762/eureka

让服务注册到多台Eureka, 下面是更改tingyi

  1. _goods

业务微服务配置:

  1. server:
  2. port: 9002
  3. #指定服务的名称
  4. spring:
  5. application:
  6. name: tingyi-goods
  7. # 指定Eureka服务地址
  8. eureka:
  9. client:
  10. service-url:
  11. defaultZone: http://root:root@EUREKA-SERVER1:8761/eureka,http://root:root@EUREKA-SERVER2:8762/eureka

让多台Eureka之间相互通讯, 更改 tingyi

  1. _eureka

微服务配置

  1. server:
  2. port: 8761 # 端口号
  3. spring:
  4. application:
  5. name: EUREKA-SERVER
  6. security:
  7. user:
  8. name: root
  9. password: root
  10. eureka:
  11. instance:
  12. hostname: localhost # localhost
  13. client:
  14. # 表示是否将自己注册到Eureka Server,默认为true
  15. registerWithEureka: true
  16. # 表示是否从Eureka Server获取注册信息,默认为true。
  17. fetchRegistry: true
  18. # 设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
  19. serviceUrl:
  20. defaultZone: http://EUREKA-SERVER1:8761/eureka,http://EUREKA-SERVER2:8762/eureka/
  21. # Eureka自我保护机制关闭, 当开启自我保护机制开启后,实例不会删除,
  22. # 导致部分请求会连接不存在的实例,客户端没有做重试或者熔断的话会出大量问题
  23. server:
  24. enable-self-preservation: false

配置域名(只是用来欺骗自己的电脑)

4.4.2 测试

演示Eureka集群

  • 先将 多个tingyi_eureka 微服务启动
  • 登录后,可以在任意管理页看到集群信息

4.4.3 Eureka的细节

EurekaClient启动时,将自己的信息注册到EurekaServer上,EurekaSever就会存储上EurekaClient的注册信息。

当EurekaClient调用服务时,本地没有注册信息的缓存时,去EurekaServer中去获取注册信息。

EurekaClient会通过心跳的方式去和EurekaServer进行连接。(默认30sEurekaClient会发送一次心跳请求,如果超过了90s还没有发送心跳信息的话,EurekaServer就认为你宕机了,将当前EurekaClient从注册表中移除

  1. eureka:
  2. instance:
  3. lease-renewal-interval-in-seconds: 30 #心跳的间隔
  4. lease-expiration-duration-in-seconds: 90 # 多久没发送,就认为你宕机了

EurekaClient会每隔30s去EurekaServer中去更新本地的注册表

  1. eureka:
  2. client:
  3. registry-fetch-interval-seconds: 30 # 每隔多久去更新一下本地的注册表缓存信息

Eureka的自我保护机制,统计15分钟内,如果一个服务的心跳发送比例低于85%,EurekaServer就会开启自我保护机制

  • 不会从EurekaServer中去移除长时间没有收到心跳的服务。
  • EurekaServer还是可以正常提供服务的。
  • 网络比较稳定时,EurekaServer才会开始将自己的信息被其他节点同步过去
  1. eureka:
  2. server:
  3. enable-self-preservation: true # 开启自我保护机制, 建议开发阶段设置为false, 不然服务停了, eureka中的信息还在.

🌟感谢支持 听忆.-CSDN博客


🎈众口难调🎈从心就好


本文转载自: https://blog.csdn.net/weixin_64296810/article/details/140372077
版权归原作者 听忆. 所有, 如有侵权,请联系我们删除。

“【微服务】SpringCloud-eureka光速入门”的评论:

还没有评论