Spring Cloud 学习之路 | 第一章 :Eureka 服务的注册和发现

一. Spring Cloud 简介

Spring Cloud 为开发者提供了快熟构建分布式系统的一些工具,包括配置管理,服务发现,断路器,路由,微代理,事件总线,全局锁,决策竞选,分布式会话,集群状态等。协调分布式系统导致样板模式,并且Spring Cloud的开发人员可以快速建立实现这些模式的服务和应用程序。他们适用于任何分布式环境,包括开发人员的笔记本,裸机数据中心和Cloud Foundry等托管平台。此外Spring Cloud基于Spring Boot,需要对Spring Boot 有一定的了解,可参见SpringBoot非官方教程link

二. Eureka 简介
Eureka 是Spring Cloud Netflix微服务套件中的一部分,易于和Spring Boot 构建的微服务整合起来。
Eureka包含了服务端和客户端组件。服务端也被称作为服务注册中心,用于提供服务的注册和发现。Eureka支持高可用的配置,当集群中有分片出现故障时,Eureka就会转入自动保护模式,它允许分片故障期间继续提供服务的发现和注册,当故障分片恢复正常时,集群中其他分片会把他们的状态再次同步回来。客户端组件包含服务消费者与服务提供者。在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性的发送心跳来更新它的服务租约。同时也可以从服务端查询当前注册的服务信息并把他们缓存到本地并周期性的刷新服务状态。

20180707224436734

三. 构建服务注册中心

  • 创建主maven工程

    首先创建一个主Maven工程,在其pom文件引入依赖,Spring Boot版本为2.1.3.RELEASE,Spring Cloud版本为Greenwich.RELEASE。这个pom文件作为父pom文件,起到依赖版本控制的作用,其他module工程继承该pom。这一系列文章全部采用这种模式。主pom代码如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <groupId>com.kimframework</groupId>
    <artifactId>eureka-cloud</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <modules>
        <module>eureka-server</module>
        <module>eureka-client</module>
    </modules>
    
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>
    
    <dependencies>
        <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>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    </project>
  • 创建Eureka Server
    创建一个Eureka Server 为服务注册中心

右键工程-->New Module-->Spring Initializr 如下图:
image

下一步-->Cloud Discovery-->Eureka Server-->下一步
image

创建完成后的Module(eureka-server) 其 pom继承主pom 文件,并引入spring-cloud-starter-netflix-eureka-server, pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
      <groupId>com.kimframework</groupId>
      <artifactId>eureka-cloud</artifactId>
      <version>1.0-SNAPSHOT</version>
      <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.kimframework</groupId>
  <artifactId>eureka-server</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>eureka-server</name>
  <description>Eureka Server</description>

  <properties>
      <java.version>1.8</java.version>
      <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
  </properties>

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

  </dependencies>

</project>

在eureka-server的启动类上添加注解@EnableEurekaServer,开启服务注册中心的功能,代码如下:

扫描二维码关注公众号,回复: 5642334 查看本文章
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

}

配置application.yml

server:
  port: 8000

spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: localhost
  client:
    fetch-registry: false
    register-with-eureka: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

在默认情况下,服务注册中心也会把自己当做是一个服务,将自己注册进服务注册中心,所以我们可以通过配置来禁用他的客户端注册行为。
配置说明:
server.port : 服务端口
spring.application.name : 应用名称
eureka.instance.hostname: eureka服务实例名称
eureka.client.fetch-registry : 禁用客户端服务检索功能
eureka.client.register-with-eureka: 表示不向服务注册中心注册自己
eureka.client.service-ur.defaultZone: 指定服务注册中心的地址

启动工程,浏览器访问eureka-server的主界面:http://localhost:8000/ 界面如下:
image
No application available 没有服务被发现 ……,因为还没有服务注册,所以暂时没有服务信息

- 创建Eureka Client
当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。
创建一个Module(eureka-client),创建过程通eureka-server相同, 选择引入Eureka Discovery 和Web

image

其pom文件如下:

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
      <groupId>com.kimframework</groupId>
      <artifactId>eureka-cloud</artifactId>
      <version>1.0-SNAPSHOT</version>
      <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <groupId>com.kimframework</groupId>
  <artifactId>eureka-client</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>eureka-client</name>
  <description>Eureka Client</description>

  <dependencies>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>

  </dependencies>
</project>

配置eureka-client的启动类,配置@EnableEurekaClient注解

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

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

}

application.yml :

server:
  port: 8001
spring:
  application:
    name: eureka-client
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka  # 服务注册中心地址

需要指明spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name 。
启动eureka-client工程,打开http://localhost:8000 ,即eureka server 的网址:
image

发现eureka-client已经注册在服务注册中心了。服务名为:EUREKA-CLIENT 端口为:8001

image

该警告就是发出了Eureka的自我保护机制!服务注册到Eureka服务器后,会向其发送心跳,Eureka在运行期间,会统计心跳失败的比率在15分钟是否低于85%,如果低于,Eureka服务器会将这些服务保护起来,不会剔除。

四: 参考资料

https://blog.csdn.net/forezp/article/details/81040925
https://blog.csdn.net/qq_27046951/article/details/82880609

猜你喜欢

转载自yq.aliyun.com/articles/695041