0


微服务组件之Eureka

1、什么是Eureka,为什么要有Eureka

在传统的RPC远程调用中,管理每个服务于服务之间依赖关系复杂,管理复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。

Eureka是Netflix开源的一款基于REST(Representational State Transfer)的服务发现框架,它主要用于微服务架构中的服务治理,能够实现自动化的服务注册与发现,是springcloud体系中的一个核心组件。Eureka服务器搭建完成后,可以将微服务注册到Eureka服务器上,客户端可以通过Eureka服务器来获取服务的地址和端口号,从而实现服务的调用。

2、Eureka有什么作用?

用来实现各个微服务实例化的自动化注册与发现。

服务注册

首先会构建一个服务中心,之后的每个服务单元向这个服务中心提供主机,端口号等信息登记自己提供的服务。

注册中心通过服务名分类组织服务清单,并对其进行维护。

服务注册中心需要以心跳的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除。

服务发现

服务之间不需要指定具体的实例地址,而是通过服务中心发起请求调用实现。所以,调用方并不需要知道服务提供方具体的位置,只需向注册中心发起请求,从而获取所有服务的实例清单,才能实现对具体服务实例的访问。

实际应用中,不会每次都向注册中心获取服务,使用了缓存和服务剔除等不同的策略。

3、如何搭建Eureka服务

创建一个maven工程,然后引入Eureka依赖,配置Eureka的各项配置,启动类添加注解

  • 1、引依赖
  • 2、加配置
  • 3、加注解
  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  5. <version>1.4.6.RELEASE</version>
  6. </dependency>
  7. </dependencies>
  1. eureka:
  2. instance:
  3. hostname: eureka1 #hostname用于eureka集群服务器之间的区分
  4. lease-expiration-duration-in-seconds: 90 #最后一次心跳后,间隔多久认定微服务不可用,默认90
  5. client:
  6. register-with-eureka: false #不向自身注册。由于该应用为单个注册中心,所以设置为false,代表不向注册中心注册自己。
  7. fetch-registry: false #不从自身拉取注册信息。由于单个注册中心,不拉取自身信息。
  8. serviceUrl.defaultZone: http://localhost:2001/eureka/
  9. server:
  10. enable-self-preservation: false #eureka的自我保护状态。测试时将其关闭
  1. package src;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. //通过注解触发自动配置
  6. @EnableEurekaServer
  7. @SpringBootApplication
  8. public class SpringCloudEurekaServerApplication {
  9. public static void main(String[] args) {
  10. SpringApplication.run(SpringCloudEurekaServerApplication.class,args);
  11. }
  12. }

4、服务注册与发现

有了Eureka服务注册与发现中心后,就可以将服务的客户端和服务的提供者都注册到Eureka

服务注册也分三步1、添加依赖 2、加配置3、加注解

引依赖时需要注意springcloud版本与springboot版本需要对应,按照对应表进行配置,否则会报错

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.6.3</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>
  7. <dependency>
  8. <groupId>org.springframework.cloud</groupId>
  9. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  10. </dependency>
  11. <dependencyManagement>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.cloud</groupId>
  15. <artifactId>spring-cloud-dependencies</artifactId>
  16. <version>2021.0.3</version>
  17. <type>pom</type>
  18. <scope>import</scope>
  19. </dependency>
  20. </dependencies>
  21. </dependencyManagement>

@EnableEurekaClient表明是Eureka客户端

  1. package com.user.service;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  5. @EnableEurekaClient
  6. @SpringBootApplication
  7. public class UserviceApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(UserviceApplication.class, args);
  10. }
  11. }
  1. eureka:
  2. instance:
  3. lease-expiration-duration-in-seconds: 30 #心跳间隔时间,默认为30s
  4. client:
  5. registry-fetch-interval-seconds: 30 #拉取注册信息间隔时间,默认30s
  6. service-url:
  7. defaultZone: http://127.0.0.1:2001/eureka #表示eureka服务注册中心的部署位置

5、服务间通过Eureka通信

服务提供者有一个接口,服务调用者需要进行调用

  1. package com.user.service.controller;
  2. import com.user.service.entity.User;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. /**
  6. * @author lijianxi
  7. * @date 2023年06月02日 3:43 下午
  8. */
  9. @RestController
  10. public class UserController {
  11. @GetMapping("/getUser")
  12. public User getUser(){
  13. User u = new User();
  14. u.setId(1);
  15. u.setName("张三");
  16. System.out.println("2被调用");
  17. return u;
  18. }
  19. }

如果没有Eureka,那么调用时候通过http请求进行调用,需要调用方维护提供者的ip地址和端口等信息,如果服务提供方不止一个,那么调用方还需要进行维护,加逻辑判断调用的是哪个

有了Eureka后,服务调用方不再维护服务提供者的ip和端口

只需要知道服务名称即可,

  1. springcloud-eureka-user就是服务调用方的服务名称

服务提供方的配置同服务调用方

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.6.3</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.user</groupId>
  12. <artifactId>user</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>Uservice</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.cloud</groupId>
  22. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-web</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-devtools</artifactId>
  31. <scope>runtime</scope>
  32. <optional>true</optional>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-configuration-processor</artifactId>
  37. <optional>true</optional>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.projectlombok</groupId>
  41. <artifactId>lombok</artifactId>
  42. <optional>true</optional>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-starter-test</artifactId>
  47. <scope>test</scope>
  48. </dependency>
  49. </dependencies>
  50. <dependencyManagement>
  51. <dependencies>
  52. <dependency>
  53. <groupId>org.springframework.cloud</groupId>
  54. <artifactId>spring-cloud-dependencies</artifactId>
  55. <version>2021.0.3</version>
  56. <type>pom</type>
  57. <scope>import</scope>
  58. </dependency>
  59. </dependencies>
  60. </dependencyManagement>
  61. <build>
  62. <plugins>
  63. <plugin>
  64. <groupId>org.springframework.boot</groupId>
  65. <artifactId>spring-boot-maven-plugin</artifactId>
  66. <configuration>
  67. <excludes>
  68. <exclude>
  69. <groupId>org.projectlombok</groupId>
  70. <artifactId>lombok</artifactId>
  71. </exclude>
  72. </excludes>
  73. </configuration>
  74. </plugin>
  75. </plugins>
  76. </build>
  77. </project>
  1. package com.user.service;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  5. @EnableEurekaClient
  6. @SpringBootApplication
  7. public class UserviceApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(UserviceApplication.class, args);
  10. }
  11. }
  1. spring:
  2. application:
  3. name: springcloud-eureka-user
  4. server:
  5. port: 8002
  6. eureka:
  7. instance:
  8. lease-expiration-duration-in-seconds: 30 #心跳间隔时间,默认为30s
  9. client:
  10. registry-fetch-interval-seconds: 30 #拉取注册信息间隔时间,默认30s
  11. service-url:
  12. defaultZone: http://127.0.0.1:2001/eureka #表示eureka服务注册中心的部署位置
  13. # info配置
  14. info:
  15. # 项目的名称
  16. app.name: 项目名-springcloud
  17. # 公司的名称
  18. company.name: 自定义配置

多个服务提供者只要name保持一致,就能够通过Eureka实现负载均衡,默认是轮询策略


本文转载自: https://blog.csdn.net/lingxiyizhi_ljx/article/details/131041668
版权归原作者 夜阑卧听风吹雨,铁马冰河入梦来 所有, 如有侵权,请联系我们删除。

“微服务组件之Eureka”的评论:

还没有评论