Spring Cloud服务注册组件Eureka(上)-单机版Eureka注册中心

一、Eureka是什么

Eureka是Spring Cloud中用于服务注册与发现的组件,类似于Zookeeper

二、Eureka中的组成

Eureka的组成三种角色

1.Eureka Server

即Eureka服务端,是服务注册中心

2.Eureka Client

即Eureka客户端,包括服务提供者(服务生产者)和服务消费者(服务调用者)

(1) 客户端操作
  • 注册服务(register):向注册中心注册服务(向注册中心报告客户端的IP、端口、运行状态指标的URL等)
  • 心跳报告(renew):每隔一段时间(默认为30秒)向注册中心发送一次心跳报告以完成服务续约。(注册中心在一定时间(默认为90秒)内,未收到心跳报告,则认为该客户端不可用,会从服务注册列表中剔除该客户端)
  • 获取服务注册列表(fetch registries):获取所有的在注册中心注册的客户端列表
  • 下线(cancel):客户端向服务端自动要求下线,注册中心收到下线通知后,会将该客户端从服务列表中剔除掉
(2)客户端分类
  • 服务提供者:提供接口服务的客户端
  • 服务调用者:调用接口服务的客户端
    • 首先从注册中心获取到相应的服务注册列表
    • 远程调用服务提供者的服务(通过客户端负载均衡组件选择服务注册列表中某个客户端进行调用)

三、Eureka主要应用配置说明

  1. # Eureka服务器相关配置说明
  2. server:
  3. port: 8001
  4. eureka:
  5. instance:
  6. hostname: localhost
  7. client:
  8. register-with-eureka: false
  9. fetch-registry: false
  10. service-url:
  11. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  • server.port : 开放服务的端口
  • eureka.instance.hostname : Eureka服务器主机的名称
  • eureka.client.register-with-eureka : 当前开启的客户端(就是当前开启的服务)是否注册到Eureka(注册中心不需要注册,因为当前本身就是Server,因此不需要注册到Eureka)
  • eureka.client.fetch-registry: 当前的服务是否要从Eureka获取注册信息(注册中心不需要获取,因为本身是Server,所以不需要向自己获取服务注册信息)
  • eureka.client.service-url.defaultZone: Eureka注册中心提供服务的地址

四、Eureka注册服务实践

1.启动Eureka的Server端(即开启注册中心的服务)
(1)maven主要依赖
  • spring boot:整个Spring Cloud都是基于Spring boot这个WEB框架
  • eureka-server:Eureka的server端包,具体包为spring-cloud-starter-netflix-eureka-server

a)打开idea后,依次点击File->New->Project

新建项目

b)选择Spring Initializr

选择Spring Initializr

c)填写maven需要的基础配置

填写maven配置

d)因为这里是注册中心组件,所以使用Cloud Discovery

使用Cloud Discovery

e)后面的直接Next即可,直到Finish

maven详细配置如下:

  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 http://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.1.1.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.github.shixinke.spring.cloud</groupId>
  12. <artifactId>item-eureka</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>item-eureka</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud.version>Finchley.SR2</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. </dependency>
  30. </dependencies>
  31. <dependencyManagement>
  32. <dependencies>
  33. <dependency>
  34. <groupId>org.springframework.cloud</groupId>
  35. <artifactId>spring-cloud-dependencies</artifactId>
  36. <version>${spring-cloud.version}</version>
  37. <type>pom</type>
  38. <scope>import</scope>
  39. </dependency>
  40. </dependencies>
  41. </dependencyManagement>
  42. <build>
  43. <plugins>
  44. <plugin>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-maven-plugin</artifactId>
  47. </plugin>
  48. </plugins>
  49. </build>
  50. <repositories>
  51. <repository>
  52. <id>spring-milestones</id>
  53. <name>Spring Milestones</name>
  54. <url>https://repo.spring.io/milestone</url>
  55. </repository>
  56. </repositories>
  57. </project>
(2)应用配置
  1. server:
  2. port: 8001
  3. eureka:
  4. instance:
  5. hostname: localhost
  6. client:
  7. register-with-eureka: false
  8. fetch-registry: false
  9. service-url:
  10. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

注:

  • eureka.client.register-with-enrekaeureka.client.fetch-registry 这两个配置项一定要设置为false,因为它本身就是注册中心,不存在自己向自己注册和获取服务注册列表信息的情况
  • eureka.client.service-url.defaultZone 这个选项单词不要写错
(3)服务启动类

与其他基于Spring Boot的WEB项目相比,多了一个 @EnableEurekaServer 的注解

  1. package com.github.shixinke.spring.cloud.itemeureka;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. @EnableEurekaServer
  6. @SpringBootApplication
  7. public class ItemEurekaApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(ItemEurekaApplication.class, args);
  10. }
  11. }

启动服务即可,注册中心服务就启动了

(4)查看服务注册情况

在浏览中输入在配置中设置的服务地址,如http://localhost:8001,正常的话,可以看到以下的界面:

服务注册统计信息

  • 主要是看客户端列表信息,由此可以判断服务(客户端)是否成功注册到server端(这里的信息有一定延迟性,并非实时统计)
2.开启服务提供者的服务
(1)添加maven主要依赖
  • Spring Boot
  • Eureka Client:具体是spring-cloud-starter-netflix-eureka-client
  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 http://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.1.1.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.github.shixinke.spring.cloud</groupId>
  12. <artifactId>item-service</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>item-provider</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring.cloud.version>Finchley.SR2</spring.cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. </dependency>
  34. </dependencies>
  35. <dependencyManagement>
  36. <dependencies>
  37. <dependency>
  38. <groupId>org.springframework.cloud</groupId>
  39. <artifactId>spring-cloud-dependencies</artifactId>
  40. <version>${spring.cloud.version}</version>
  41. <type>pom</type>
  42. <scope>import</scope>
  43. </dependency>
  44. </dependencies>
  45. </dependencyManagement>
  46. <build>
  47. <plugins>
  48. <plugin>
  49. <groupId>org.springframework.boot</groupId>
  50. <artifactId>spring-boot-maven-plugin</artifactId>
  51. </plugin>
  52. </plugins>
  53. </build>
  54. </project>
(2)应用配置
  • eureka.client.service-url.defaultZone:标注注册中心的地址
  • spring.application.name:指明应用的名称
  1. server:
  2. port: 8002
  3. eureka:
  4. client:
  5. service-url:
  6. defaultZone: http://localhost:8001/eureka/
  7. spring:
  8. application:
  9. name: item-provider-1
(3)应用启动类
  1. package com.github.shixinke.spring.cloud.itemprovider;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  5. @SpringBootApplication
  6. @EnableEurekaClient
  7. public class ItemProviderApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(ItemProviderApplication.class, args);
  10. }
  11. }
(4)定义控制器方法(对外提供的接口)

与普通的Spring boot应用中的控制器没有任何区别

  1. package com.github.shixinke.spring.cloud.itemprovider.controller;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. @RestController
  6. @RequestMapping("/health")
  7. public class HealthCheck {
  8. @Value("${server.port}")
  9. private int serverPort;
  10. @Value("${spring.application.name}")
  11. private String appName;
  12. @RequestMapping("/check")
  13. public String check() {
  14. return String.format("Server running on port:%d, application name is %s", serverPort, appName);
  15. }
  16. }
(5)启动服务,如果成功注册,可以在注册中心的控制台上看到相应的信息

启动服务后,服务注册成功的界面

3.开启服务调用者的服务

服务调用者作为Eureka的客户端,与服务提供者步骤是完全相同的,参考上一节的步骤,只需要将应用名称修改为自己的名称即可

完整代码:https://github.com/shixinke/spring-cloud-practise