SpringCloud 定义Eureka服务端、Eureka服务信息、Eureka发现管理、Eureka安全配置、Eureka-HA机制、 Eureka服务打包部署

对于服务发现框架可以简单的理解为服务的注册以及使用操作步骤,例如:在 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>
            <version>1.4.2.RELEASE</version>
        </dependency>
 3、 【microcloud-eureka-7001】现在修改 application.properties 配置文件,在这个配置文件里面

主要进行 eureka 服务的定义。

server.port=7001
eureka.instancehostname=localhost
 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://localhost:7001/
2.2、向 Eureka 中注册部门微服务

现在 Eureka 已经可以正常启用了,那么随后就需要在项目之中将所有的微服务信息注册到 Eureka 服务

之中,那么这样就可以被客户端执行并且调用了。

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

        <dependency>
            <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.properties配置文件,

在这个配置文件之中主要是定义要进行注册的 Eureka 服务的地址,而这个地址就是 Eureka 的客户端配置。

application.properties

eureka.client.serviceUrl.defaultZone=http://localhost: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.properties配置文件,为此微服务设置一个

名字(这个名字将作为日后负载均衡)

application.properties

spring.application.name=microcloud-provider-dept
 2.3、Eureka 服务信息

现在虽然成功的实现了微服务的 Eureka 注册,但是所表现出来的微服务的信息并不完整,因为给定的地址

信息是你的主机名称,而我们现在是一个自定义的路径地址。

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

显示:

eureka.instance.instance-id=dept-8001.com

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

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

eureka.instance.prefer-ip-address=true

3、 【microcloud-provider-dept-8001】如果现在要想查看所有的微服务详细信息,则需要修改 pom.xml 

文件,追加监控配置:

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

microcloud/pom.xml

            <dependency>    <!-- SpringCloud离不开SpringBoot,所以必须要配置此依赖包 -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.5.12.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </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.properties 配置文件,追加 info 的

相关信息:

info.app.name=study-microcloud
info.company.name=www.study.cn
info.pom.artifactId=$project.artifactId$
info.pom.version=$project.version$

http://10.40.8.144:8001/info

{"pom":{"version":"0.0.1","artifactId":"microcloud-provider-dept-8001"},
"app":{"name":"study-microcloud"},"company":{"name":"www.study.cn"}}
 2.4、Eureka 发现管理

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

要面临以下问题:

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

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

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

spring.application.name=microcloud-eureka-7001
eureka.server.evictionIntervalTimerInMs=60000
eureka.client.serviceUrl.defaultZone=http://localhost:7001/eureka
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.instance.hostname=localhost

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

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

认为可以清理掉。
 2、 【microcloud-eureka-7001】在 Eureka 里面有一个问题,这个问题就是它默认支持有保护模式的

概念,所谓的保护模式指的是 即便现在某一个微服务不可用了,eureka 不会清理,依然会进行该微服务信息

的保存。

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

application.properties

eureka.server.enableSelfPreservation=true

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

清除过程。
 3、 【microcloud-provider-dept-8001】微服务客户端之所以可以与 Eureka 之间保持联系,依靠的是

心跳机制,也就是说你客户端 可以自己来进行心跳的配置处理,修改 application.properties 配置文件:

eureka.instance.leaseRenewalIntervalInSeconds=2
eureka.instance.leaseExpirationDurationInSeconds=5

由于所有的服务都注册到了 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.GET)
    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://localhost:8001/dept/discover

{"services":[],
"localServiceInstance":
{"host":"10.40.8.144","port":8001,
"serviceId":"microcloud-provider-dept",
"metadata":{},
"uri":"http://10.40.8.144:8001",
"secure":false}
}
 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 开发包,则每一次启动微服务的
时候都会自动生成一个密码, 而这个密码由于会改变,所以一般都不使用,所以要修改pplication.properties
 配置文件,追加密码的配置项:

security.basic.enabled=true
security.user.name=edmin
security.user.password=studyjava

eureka.client.serviceUrl.defaultZone=http://edmin:studyjava@localhost:7001/eureka

 此时访问 eureka 的服务地址为:

http://edmin:studyjava@localhost:7001/
 3、 【microcloud-provider-dept-8001】修改 application.properties配置文件,进行授权的注册连接:

application.properties

eureka.client.serviceUrl.defaultZone=http://edmin:studyjava@localhost:7001/eureka
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.properties 配置文件,这个配置文件主要注意端口号

以及 Eureka 服务注册位置;

eureka.instance.hostname=eureka1

eureka.client.serviceUrl.defaultZone
=http://edmin:studyjava@eureka2:7002/eureka,http://edmin:studyjava@eureka3:7003/eureka
 4、 【microcloud-eureka-7002】修改 application.properties 配置文件:

server.port=7002
eureka.instance.hostname=eureka2

spring.application.name=microcloud-eureka-7002
eureka.server.evictionIntervalTimerInMs=60000
eureka.client.serviceUrl.defaultZone
=http://edmin:studyjava@eureka1:7001/eureka,http://edmin:studyjava@eureka3:7003/eureka
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false


#eureka.server.enableSelfPreservation=true

security.basic.enabled=true
security.user.name=edmin
security.user.password=studyjava
 5、 【microcloud-eureka-7003】修改 application.properties 配置文件:
server.port=7003
eureka.instance.hostname=eureka3

spring.application.name=microcloud-eureka-7003
eureka.server.evictionIntervalTimerInMs=60000
eureka.client.serviceUrl.defaultZone
=http://edmin:studyjava@eureka1:7001/eureka,http://edmin:studyjava@eureka2:7002/eureka
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false


#eureka.server.enableSelfPreservation=true

security.basic.enabled=true
security.user.name=edmin
security.user.password=studyjava
 6、 启动所有的 eureka 服务,而后进入到每一个服务的后台去观察运行的副本效果:

· 登录 7001 控制台:

http://edmin:studyjava@localhost:7001/

· 登录 7002 控制台:

http://edmin:studyjava@localhost:7002/

· 登录 7003 控制台:

http://edmin:studyjava@localhost:7003/
eureka.client.serviceUrl.defaultZone配置项的地址,不能使用localhost
要使用eureka1之类的域名,通过host映射到127.0.0.1
在hosts中添加:

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

eureka.client.serviceUrl.defaultZone=
http://edmin:studyjava@eureka1:7001/eureka,
http://edmin:studyjava@eureka2:7002/eureka,
http://edmin:studyjava@eureka3:7003/eureka
 2.7、Eureka 服务打包部署

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

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

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

<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>
  <groupId>microcloud-eureka-server</groupId>
  <artifactId>microcloud-eureka-server</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.12.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
		<thymeleaf-layout-dialect.version>2.3.0</thymeleaf-layout-dialect.version>
		<!-- 布局功能的支持程序 thymeleaf3主程序 layout2以上版本 -->
		<!-- thymeleaf2 layout1 -->
		<thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
	</properties>	
	
	<dependencies>
		<dependency>
			<!-- 引入web模块 -->
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
		</dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>1.4.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>1.4.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
	</dependencies>
  
    <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>
  
</project>

 

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_StartSpringCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(Eureka_StartSpringCloudApplication.class, args);
    }
}
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。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值