SpringCloud入门:03-SpringCloud实战-微服务注册和发现Eureka

SpringCloud-03-SpringCloud实战-微服务注册和发现Eureka

什么是服务发现

在我们之前的文章中我们已经介绍了微服务关系中的服务提供者和服务消费者,这里我们引入第三者-服务发现组件

SpringCloud入门:03-SpringCloud实战-微服务注册和发现Eureka

  • 微服务启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件中会存储这些信息
  • 服务消费者可以从服务发现组件中获取对于微服务的地址,并且调用微服务
  • 服务发现组件和服务消费者之间使用心跳或者其他的机制进行通信,但超出一段时间无法和微服务进行通信则会注销该实例。
  • 微服务地址发送变更,则会冲洗注册到服务发现组件中,这些就可以避免我们之前硬编码地址带来的修改问题。

综上可知:服务发现组件应该具有如下的功能:

  • 服务注册表:服务发现组件的核心,通过它来记录和发现各个微服务的信息,用来查询和管理微服务的API
  • 服务发现和服务注册:服务注册是微服务启动时,叫你给自己的信息注册到服务发现组件上的过程,服务发现是指查询可用微服务列表以及网络地址的机制。
  • 服务检查:服务发现组件使用一定的机制来检查已经注册的服务,当该服务出现问题会注销该服务。

Eureka简介

Eureka:是Netfix开源的服务发现组件,本身是一个基于REST的服务。包含Server和Client两部分。

Eureka原理:
SpringCloud入门:03-SpringCloud实战-微服务注册和发现Eureka

上述描述了Eureka的集群原理,下面我们简单的解释一下:

  • Applicatioin Service:相当于服务提供者
  • Application Client:相当于服务消费者
  • Eureka client:java客户端,简化和Eureka Service的交互
  • Eureka Server:提供服务发现能力,每个微服务启动时,会向Eureka Server注册自己的信息(包括地址和端口,微服务名称等等)
  • 当微服务启动后,会定期给Eureka Server发送心跳来维持连接,若超时未发送,则Eureka Server则会将这个微服务从注册表中注销
  • Server 直接会同步信息,每个server同时也是client,client会缓存注册表中的信息,当server服务器宕掉后,服务消费者也可以通过缓存中的信息来访问微服务。

编写Eureka server

下面来创建简单的Eureka server 实例:

1、利用IDEA创建简单的spring Initializer 来创建简单的springboot项目
SpringCloud入门:03-SpringCloud实战-微服务注册和发现Eureka

2、给项目的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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>
    </dependencies>
    <!--添加spring cloud 依赖-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencides</artifactId>
                <version>Edgware.RELEASE</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>

3、编写启动类,启动类上需要添加@EnableEurekaServer注解声明这是一个Eureka Server。

注意在启动类上添加@EnableEurekaServer注解声明这是一个Eureka Server.

@SpringBootApplication
@EnableEurekaServer
public class DemoApplication {

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

}

4、在配置文件application.yml中添加如下内容:

server:
  port: 8761
eureka:
  client:
#    表示是否将自己注册到eureka server中
    register-with-eureka: false
#   表示是否从Eureka server获取注册信息
    fetch-registry: false
#    设置和Eureka server交互的地址
    serviceUrl:
        defaultZone: http://localhost:8761/eureka/

5、启动主启动类,访问http://localhost:8761/,便可以得到如下界面:

SpringCloud入门:03-SpringCloud实战-微服务注册和发现Eureka

下面我们将之前的微服务注册到Eureka server上:

1、创建新的服务提供者项目
这里我们使用的第二节的用户微服务:具体的项目结构图如下:
SpringCloud入门:03-SpringCloud实战-微服务注册和发现Eureka
2、在pom.xml上添加如下依赖

   <!--添加Eureka依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

3、在配置文件中添加如下配置

#配置数据源
spring:
  application:
    name: microserver-provider-user
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
  main:
    allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册
  eureka:
    client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/
        instance:
#          prefer-ip-address:true表示将自己的服务注册到Eureka server上
          prefer-ip-address: true

4、编写启动类

@SpringBootApplication
public class DemoApplication {

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

}

5、启动Eureka server和服务消费者和服务提供者
首先启动Eureka server ,再次启动服务提供者,服务消费者:

SpringCloud入门:03-SpringCloud实战-微服务注册和发现Eureka

Eureka用户认证

1、创建新的Eureka Server,这里我们用之前的Eureka Server 作为例子

2、在pom.xml文件中添加spirng-boot-starter-sercurity的依赖,如下:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>2.1.3.RELEASE</version>
</dependency>
<!--注意版本要和springboot版本一致-->

3、在applicatioin.yml中添加如下内容:

sercurity:
    basic:
        enbaled:true
    user:
        name:user
        password:123

4、将Eureka Server中的defaultZone修改成包括用户名和密码的形式

 eureka:
    client:
        serviceUrl:
          <!--defaultZone: http://name:[email protected]:8761/eureka/-->
          defaultZone: http://user:[email protected]:8761/eureka/

Eureka的元数据

Eureka的元数据有两种:1、标准元数据 2、自定义元数据

标准元数据:一般是主机名,IP地址,端口号,状态页,健康检查等信息,这些信息会被发布在服务注册表上

自定义数据:可以使用eureka.instance.metadata-map配置
这里笔者不做详细展开。

Eureka的自我保护模式

Eureka的自我保护模式:
默认情况下,若Eureka Server在一定时间没有接收到某个微服务的心跳,Eureka会注销该实例,但是当网络出现问题,微服务和Eureka server 无法正常通行,这种情况下Eureka server会在短期时间内丢失大量的客户端,这时候节点就会进入自我保护模式,来保护注册表中的信息不会被删除,当网络故障恢复后,Eureka server 节点会自动退出自我保护模式。

自我保护模式的思想是:宁可保留所有的服务(健康和不健康的服务),也不盲目注销任何健康的微服务。

今日分享:

当一个人痛苦的时候才会变得才华横溢,当我的生活步入正轨时,我开始跟你一样,像你忘记我那样忘记你,然后忘掉那些痛苦,开始变得平庸可耻。我不愿这样,也不愿意这样,我无法触及你,你就像盖茨比的梦,璀璨无比,却又触不可及。前方的路上诱惑太多,我没有盖茨比那么了不起,我可能走上其他的路,无法一直追逐你的脚步。
——菲茨杰拉德《了不起的盖茨比》