转载和引用,请注明原文出处! Fork me on GitHub
结局很美妙的事,开头并非如此!

SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端、Eureka 服务信息、Eureka 发现管理、Eureka 安全配置、Eureka-HA(高可用) 机制、Eureka 服务打包部署)

声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅。

1、概念:Eureka 服务发现框架

2、具体内容

对于服务发现框架可以简单的理解为服务的注册以及使用操作步骤,例如:在 ZooKeeper 组件,这个组件里面已经明确的描述了一个服务的注册以及发现操作流程,在整个 Rest 架构里面,会存在有大量的微服务的信息。

在 SpringCloud 之中使用了大量的 Netflix 的开源项目,而其中 Eureka 就属于 Netflix 提供的发现服务组件,所有的微服务在使用之中全部向 Eureka 之中进行注册,而后客户端直接利用 Eureka 进行服务信息的获得。

Eureka 的主要作用实际上和 ZooKeeper 是非常类似的,但是在 SpringCloud 虽然支持有 ZooKeeper,不过从官方的宣传角度来说并不支持这样处理,推荐使用 Eureka,因为速度更快,同时该服务组件是以程序的形式出现的,也就是说你只需要编写一个程序的项目类,而后就可以启动 Eureka 注册服务了。

 2.1、定义 Eureka 服务端

 1、 为了方便进行统一的微服务的管理,建议创建一个新的项目:microcloud-eureka-7001;

 2、 【microcloud-eureka-7001】的 pom.xml 配置文件,追加相应的依赖支持库

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

 3、 【microcloud-eureka-7001】现在修改 application.yml 配置文件,在这个配置文件里面主要进行 eureka 服务的定义。

server:
  port: 7001
eureka: 
  instance: # eureak实例定义
    hostname: eureka-7001.com # 定义Eureka实例所在的主机名称

 4、 【microcloud-eureka-7001】修改 hosts 配置文件,追加 eureka 的映射地址。

 127.0.0.1 eureka-7001.com

 5、 【microcloud-eureka-7001】修改 Eureka 程序启动类,追加有 Eureka 服务声明的注解@EnableEurekaServer:

package cn.study.microcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class Eureka_7001_StartSpringCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(Eureka_7001_StartSpringCloudApplication.class, args);
    }
}

 6、 运行程序后通过浏览器执行路径:http://eureka-7001.com:7001/

 

2.2、向 Eureka 中注册部门微服务

 现在 Eureka 已经可以正常启用了,那么随后就需要在项目之中将所有的微服务信息注册到 Eureka 服务之中,那么这样就可以被客户端执行并且调用了。

 1、 【microcloud-provider-dept-8001】修改 pom.xml 配置文件,追加有 eureka 的相关依赖支持包;

            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

 2、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,在这个配置文件之中主要是定义要进行注册的 Eureka 服务的地址,而这个地址就是 Eureka 的客户端配置。

eureka:
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://eureka-7001.com:7001/eureka

 3、 【microcloud-provider-dept-8001】修改项目的运行主类,在这个主类上追加有 Eureka 客户端的启用注解@EnableEurekaClient

package cn.study.microcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class Dept_8001_StartSpringCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(Dept_8001_StartSpringCloudApplication.class, args);
    }
}

 此时由于存在有“@EnableEurekaClient”注解信息,所以当服务启动之后该服务会自动注册到Eureka服务器之中;

 4、 【microcloud-provider-dept-8001】修改application.yml配置文件,为此微服务设置一个名字(这个名字将作为日后负载均衡)

spring:
  application:
    name: microcloud-provider-dept

 2.3、Eureka 服务信息

 现在虽然成功的实现了微服务的 Eureka 注册,但是所表现出来的微服务的信息并不完整,因为给定的地址信息是你的主机名称,而我们现在是一个自定义的路径地址。

 1、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,追加主机名称的显示:

eureka:
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://eureka-7001.com:7001/eureka
  instance:
    instance-id: dept-8001.com  # 在信息列表时显示主机名称

 重新访问eureka注册中心可以看到服务名称变了

2、 【microcloud-provider-dept-8001】在服务信息查看的时候应该以 IP 地址作为连接项。

eureka:
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://eureka-7001.com:7001/eureka
  instance:
    instance-id: dept-8001.com  # 在信息列表时显示主机名称
    prefer-ip-address: true     # 访问的路径变为IP地址

 

3、 【microcloud-provider-dept-8001】如果现在要想查看所有的微服务详细信息,则需要修改 pom.xml 文件,追加监控配置:

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

 4、 【microcloud】修改 pom.xml 文件,追加一个信息匹配的插件:

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <delimiters>
                        <delimiter>$</delimiter>
                    </delimiters>
                </configuration>
        </plugin>

 5、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,追加 info 的相关信息:

info:
  app.name: study-microcloud
  company.name: www.study.cn
  build.artifactId: $project.artifactId$
  build.version: $project.verson$

 2.4、Eureka 发现管理

 在实际的项目运行过程之中需要通过 Eureka 作为所有微服务的监控处理程序,但是对于监控程序那么就必然要面临以下问题:

 · 新服务追加的时候应该立刻可以进行注册;

 · 当某一个服务下线之后应该可以进行清理;

 1、 【microcloud-eureka-7001】设置服务的清理间隔,修改 application.yml 配置文件

eureka: 
  server:
    eviction-interval-timer-in-ms: 60000 # 设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://eureka-7001.com:7001/eureka
    register-with-eureka: false    # 当前的微服务不注册到eureka之中
    fetch-registry: false     # 不通过eureka获取注册信息
  instance: # eureak实例定义
    hostname: eureka-7001.com # 定义Eureka实例所在的主机名称

 一旦配置了清理的间隔为 1 秒的时间,则会在每秒的时候进行一次服务的清理过程

 一般情况下,该配置不建议进行修改,默认就是 60 秒,也就是说你的微服务如果 60 秒没有心跳了,那么就认为可以清理掉。

 2、 【microcloud-eureka-7001】在 Eureka 里面有一个问题,这个问题就是它默认支持有保护模式的概念,所谓的保护模式指的是 即便现在某一个微服务不可用了,eureka 不会清理,依然会进行该微服务信息的保存。

 

如果现在要想去改变这种保护模式的启用,则可以修改 application.yml 配置文件:

eureka: 
  server:
    enable-self-preservation: true # 设置为false表示关闭保护模式
    eviction-interval-timer-in-ms: 60000 # 设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://eureka-7001.com:7001/eureka
    register-with-eureka: false    # 当前的微服务不注册到eureka之中
    fetch-registry: false     # 不通过eureka获取注册信息
  instance: # eureak实例定义
    hostname: eureka-7001.com # 定义Eureka实例所在的主机名称

 理论上只有关闭了保护模式之后才可以进行无效微服务的清理操作,但是很多时候 Eureka 里面也会自带有清除过程。

 3、 【microcloud-provider-dept-8001】微服务客户端之所以可以与 Eureka 之间保持联系,依靠的是心跳机制,也就是说你客户端 可以自己来进行心跳的配置处理,修改 application.yml 配置文件:

eureka:
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://eureka-7001.com:7001/eureka
  instance:
    lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
    lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
    instance-id: dept-8001.com  # 在信息列表时显示主机名称
    prefer-ip-address: true     # 访问的路径变为IP地址

 由于所有的服务都注册到了 Eureka 之中,这样如果配置了“lease-expiration-duration-in-seconds”此选项,表示距 离上一次发送心跳之后等待下一次发送心跳的间隔时间,如果超过了此间隔时间,则认为该微服务已经宕机了。

 4、 【microcloud-provider-dept-8001】现在对于注册到 Eureka 上的微服务端也可以通过发现服务来进行一些服务信息的获取,修 改 DeptRest 程序类,追加一个控制调用方法:

package cn.study.microcloud.rest;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import cn.study.microcloud.service.IDeptService;
import cn.study.vo.Dept;

@RestController
public class DeptRest {
    @Resource
    private IDeptService deptService ;
    @Resource
    private DiscoveryClient client ;    // 进行Eureka的发现服务
    @RequestMapping("/dept/discover")
    public Object discover() {    // 直接返回发现服务信息
        return this.client ;
    }
    
    @RequestMapping("/dept/sessionId")
    public Object id(HttpServletRequest request) {
        return request.getSession().getId() ;
    }
    
    @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
    public Object get(@PathVariable("id") long id) {
        return this.deptService.get(id) ;
    }
    @RequestMapping(value="/dept/add",method=RequestMethod.POST)
    public Object add(@RequestBody Dept dept) {
        return this.deptService.add(dept) ;
    }
    @RequestMapping(value="/dept/list",method=RequestMethod.GET)
    public Object list() {
        return this.deptService.list() ;
    }
}

 5、 【microcloud-provider-dept-8001】在主程序之中加上注解@EnableDiscoveryClient启用 Eureka 发现服务项:

package cn.study.microcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class Dept_8001_StartSpringCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(Dept_8001_StartSpringCloudApplication.class, args);
    }
}

 6、 输入访问地址:http://dept-8001.com:8001/dept/discover

{"services":[],"localServiceInstance":{"host":"192.168.31.247",
"port":8001,"secure":false,"serviceId":"microcloud-provider-dept","metadata":{},"uri":"http://192.168.31.247:8001"}}

 2.5、Eureka 安全配置

 现在已经成功的实现了一个 Eureka 的服务启动以及微服务的注册配置操作,但是现在的程序有一个问题,你自己公司的 Eureka 服务应该可以注册的服务只能够是满足于认证要求的微服务,所以这样一来在之前所进行的 Eureka 里面配置缺少关键性的一步: 安全认证,所以应该为 Eureka 配置上安全认证处理。

 1、 【microcloud-eureka-7001】修改 pom.xml 配置文件,引入 SpringSecurity 的依赖包:

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

 2、 【microcloud-eureka-7001】一旦我们的项目之中导入了 Security 开发包,则每一次启动微服务的时候都会自动生成一个密码, 而这个密码由于会改变,所以一般都不使用,所以要修改 application.yml 配置文件,追加密码的配置项:

server:
  port: 7001

security:
  basic:
    enabled: true   # 启用安全认证处理
  user:
    name: edmin     # 用户名
    password: studyjava  # 密码

spring:
  application:
    name: microcloud-eureka-7001
eureka: 
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka
    register-with-eureka: false    # 当前的微服务不注册到eureka之中
    fetch-registry: false     # 不通过eureka获取注册信息
  instance: # eureak实例定义
    hostname: eureka-7001.com # 定义Eureka实例所在的主机名称

 此时访问 eureka 的服务地址为:http://edmin:studyjava@eureka-7001.com:7001/

 3、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,进行授权的注册连接:

eureka:
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka
  instance:
    lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
    lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
    instance-id: dept-8001.com  # 在信息列表时显示主机名称
    prefer-ip-address: true     # 访问的路径变为IP地址

 

2.6、Eureka-HA(高可用) 机制

 现在已经成功的实现了一个 Eureka 服务器,但是现在属于单节点的服务运行过程,如果说现在单节点的 Eureka 出现了错误, 导致无法使用,那么对于所有的微服务的架构就将出现整体的瘫痪,就需要进行 Eureka 集群搭建,同时利用集群可以有效的实现 HA 的处理机制,如果要进行集群的搭建一定要选择两台或以上的电脑完成,而基本的流程如下:

 

说明:Eureka集群是两两相互注册,当然了传递注册也是可以实现集群的

1、 修改 hosts 配置文件进行多个主机名称的定义:

127.0.0.1 eureka-7001.com
127.0.0.1 eureka-7002.com
127.0.0.1 eureka-7003.com

 2、 【 microcloud-eureka-7001 】 为 了 方 便 进 行 Eureka 操 作 , 建 议 将 “ microcloud-eureka-7001 ”的进行复制,复制为 “microcloud-eureka-7002”、“ microcloud-eureka-7003”。

 3、 【microcloud-eureka-7001】修改 application.yml 配置文件,这个配置文件主要注意端口号以及 Eureka 服务注册位置;

server:
  port: 7001
security:
  basic:
    enabled: true   # 启用安全认证处理
  user:
    name: edmin     # 用户名
    password: studyjava  # 密码
spring:
  application:
    name: microcloud-eureka-7001
eureka: 
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://edmin:studyjava@eureka-7002.com:7002/eureka,http://edmin:studyjava@eureka-7003.com:7003/eureka
    register-with-eureka: false    # 当前的微服务不注册到eureka之中
    fetch-registry: false     # 不通过eureka获取注册信息
  instance: # eureak实例定义
    hostname: eureka-7001.com # 定义Eureka实例所在的主机名称

 4、 【microcloud-eureka-7002】修改 application.yml 配置文件:

server:
  port: 7002
security: 
  basic:
    enabled: true   # 启用安全认证处理
  user:
    name: edmin     # 用户名
    password: studyjava  # 密码
spring: 
  application:
    name: microcloud-eureka-7002
eureka: 
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka,http://edmin:studyjava@eureka-7003.com:7003/eureka
    register-with-eureka: false    # 当前的微服务不注册到eureka之中
    fetch-registry: false     # 不通过eureka获取注册信息
  instance: # eureak实例定义
    hostname: eureka-7002.com # 定义Eureka实例所在的主机名称

 5、 【microcloud-eureka-7003】修改 application.yml 配置文件:

server:
  port: 7003
security:
  basic:
    enabled: true   # 启用安全认证处理
  user:
    name: edmin     # 用户名
    password: studyjava  # 密码
spring:
  application:
    name: microcloud-eureka-7003
eureka: 
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka,http://edmin:studyjava@eureka-7002.com:7002/eureka
    register-with-eureka: false    # 当前的微服务不注册到eureka之中
    fetch-registry: false     # 不通过eureka获取注册信息
  instance: # eureak实例定义
    hostname: eureka-7003.com # 定义Eureka实例所在的主机名称

 6、 启动所有的 eureka 服务,而后进入到每一个服务的后台去观察运行的副本效果:

· 登录 7001 控制台:http://edmin:studyjava@eureka-7001.com:7001/;

· 登录 7002 控制台:http://edmin:studyjava@eureka-7002.com:7002/;

· 登录 7003 控制台:http://edmin:studyjava@eureka-7003.com:7003/。

 

7、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,进行多台主机注册:

eureka:
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka,http://edmin:studyjava@eureka-7002.com:7002/eureka,http://edmin:studyjava@eureka-7003.com:7003/eureka
  instance:
    lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
    lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
    instance-id: dept-8001.com  # 在信息列表时显示主机名称
    prefer-ip-address: true     # 访问的路径变为IP地址

 2.7、Eureka 服务打包部署

 现在已经成功的实现了 Eureka 编写,但是在实际的运行之中,需要将 Eureka 发布到具体的服务器上进行执行,而这就需要对 项目进行打包处理,同样在进行打包处理的时候也必须考虑到项目的各种环境:开发(dev)、测试(beta)、生产(product),那么 下面也将基于这样的方式进行 eureka 项目打包操作。

 本次的打包处理将直接基于 yml 配置文件完成,对于 properties 配置与 SpringBoot 讲解微服务发布的处理过程一样。

 1、 【microcloud-eureka-server】修改 application.yml 配置文件

spring:
  profiles:
    active:
    - dev-7001
---
spring:
  profiles: dev-7001
  application: 
    name: microcloud-eureka-7001
server:
  port: 7001
security:
  basic:
    enabled: true   # 启用安全认证处理
  user:
    name: edmin     # 用户名
    password: studyjava  # 密码
eureka: 
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://edmin:studyjava@eureka-7002.com:7002/eureka,http://edmin:studyjava@eureka-7003.com:7003/eureka
    register-with-eureka: false    # 当前的微服务不注册到eureka之中
    fetch-registry: false     # 不通过eureka获取注册信息
  instance: # eureak实例定义
    hostname: eureka-7001.com # 定义Eureka实例所在的主机名称
---
spring:
  profiles: dev-7002
  application: 
    name: microcloud-eureka-7002
server:
  port: 7002
security: 
  basic:
    enabled: true   # 启用安全认证处理
  user:
    name: edmin     # 用户名
    password: studyjava  # 密码
eureka: 
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka,http://edmin:studyjava@eureka-7003.com:7003/eureka
    register-with-eureka: false    # 当前的微服务不注册到eureka之中
    fetch-registry: false     # 不通过eureka获取注册信息
  instance: # eureak实例定义
    hostname: eureka-7002.com # 定义Eureka实例所在的主机名称
---
spring:
  profiles: dev-7003
  application:
    name: microcloud-eureka-7003
server:
  port: 7003
security:
  basic:
    enabled: true   # 启用安全认证处理
  user:
    name: edmin     # 用户名
    password: studyjava  # 密码
eureka: 
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka,http://edmin:studyjava@eureka-7002.com:7002/eureka
    register-with-eureka: false    # 当前的微服务不注册到eureka之中
    fetch-registry: false     # 不通过eureka获取注册信息
  instance: # eureak实例定义
    hostname: eureka-7003.com # 定义Eureka实例所在的主机名称

 2、 【microcloud-eureka-server】添加一个打包的处理插件,修改 pom.xml 配置文件:

    <build>
        <finalName>eureka-server</finalName>
        <plugins>
            <plugin>    <!-- 该插件的主要功能是进行项目的打包发布处理 -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>    <!-- 设置程序执行的主类 -->
                    <mainClass>cn.study.microcloud.Eureka_StartSpringCloudApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

 3、 运行 maven:clean install package;

 

随后就可以在项目的目录之中发现生成的“eureka-server.jar”文件。

 4、 采用默认的方式执行 eureka-server.jar,那么此时将运行在 7001 端口上:java -jar eureka-server.jar

 5、 运行其它的两个 profile 配置:

 · 运行“dev-7002”profile:java -jar eureka-server.jar --spring.profiles.active=dev-7002;

· 运行“dev-7003”profile:java -jar eureka-server.jar --spring.profiles.active=dev-7003。

posted @ 2018-04-13 21:51  小不点啊  阅读(3651)  评论(4编辑  收藏  举报