Spring Cloud 为开发者提供了在分布式系统中的一些常用的组件(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁定,决策竞选,分布式会话集群状态)。使用Spring Cloud开发人员可以快速地完成实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作

Eureka

学过 Dubbo 的一定不会陌生 ZooKeeper ,那么学 Spring Cloud 的就不能陌生 Eureka。它是 Netflix 开源的一款基于REST(Representational State Transfer)风格的服务发现框架,目前已被 Spring Cloud 集成在其子项目 spring-cloud-netflix 中,用于 Spring Cloud 的服务注册发现功能。

  • 纯正的 Servlet 应用,jar/war 包部署
  • 使用 Jersey 框架实现自身的 RESTful HTTP 接口
  • peer 之间的同步与服务的注册全部通过 HTTP 协议实现
  • 利用 JDK Timer 实现 心跳检测、定时清理过期服务、节点同步等功能(动态添加删除节点、弹性)
  • 使用 Google 的 guava 包管理内存缓存
  • 目前 2.0 已经停止开源,但在 Finchley 版中 Spring Cloud 所采用的是 1.9.x 版本(持续维护),所以完全不用担心,同时 Spring Cloud 还提供了 EurekaConsulZooKeeperEtcd 等多款服务注册发现功能的框架,完全不用担心会在一棵树上吊死

Eureka 的 Server 与 Client

  • Eureka Server: 提供服务注册与发现,Client 节点启动后,会向 Eureka Server 发送注册事件,Eureka Server 注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。基于 Jersey 框架实现自身的 RESTful HTTP 接口,只要满足规范任何语言程序都能向其进行注册
  • Eureka Client: 任何形式的客户端,只要满足 Eureka Server 订制的注册标准。

你好 Eureka Server

搭建一个 Eureka Server 是最为容易的,只需要一个依赖即可完成。在 Finchley 版本中 artifactId 与早期的有所差异,所以大家在使用 Spring Cloud 一定要注意自己所使用的版本,如果询问它人相关问题,也应该告知对方你所采用的版本

依赖

1
2
3
4
5
6
7
<!-- 此处我只给出了 Eureka Server 需要用到的包依赖,
为了篇幅考虑 spring-boot-starter-parent 及 spring-cloud-dependencies
并未将其粘贴出来,有需要的可以点击文末的 GITHUB 连接进去 copy -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

配置文件

在 src/main/resources 目录下创建一个 bootstrap.yml 的文件,文中我已经将部分需要注意的配置项罗列出来,并附写好相关说明,更多配置可以参考 EurekaInstanceConfigBean 、 EurekaClientConfigBean 、 EurekaServerConfigBean 。绝大多数情况下对于 Eureka Server 只需了解每个配置的作用及其意义即可,因为错误的配置反而会破坏原有的保护特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server:
port: 7071
eureka:
instance:
prefer-ip-address: true
# 生产环境中官方是不建议修改默认配置,因为那样会破坏 eureka server 的保护模式
server:
# 关闭保护模式(生产环境不建议修改)
enable-self-preservation: false
# 清理间隔(默认是60 * 1000 毫秒)(生产环境不建议修改)
eviction-interval-timer-in-ms: 60000
# Eureka 拉取服务列表时间(默认:30秒)(生产环境不建议修改)
remote-region-registry-fetch-interval: 5
client:
# eureka server 没必要自己把自己注册上去,所以可以设置成 false
register-with-eureka: false
# 是否从Eureka Server上获取注册信息,默认为true,此处建议修改成 false (单机设置的意义不大,如果设置成 true 启动会去抓取一次注册表,获取不到更新缓存就会出错(该错误不影响 eureka 正常使用))
fetch-registry: false
service-url:
# 默认注册地址 this.serviceUrl.put("defaultZone", "http://localhost:8761/eureka/");
# 划重点:此处的 defaultZone 千万别写成 default-zone
defaultZone: http://localhost:${server.port}/eureka/
# 从 Eureka 服务器端获取注册信息的间隔时间(默认:30秒)
registry-fetch-interval-seconds: 5

主函数

与往常 Spring Boot 启动类类似,不同的是多了一个 @EnableEurekaServer 注解,用来标识当前工程是Eureka Server,到此我们 Server 就算是搭建完成了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.battcn;

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

访问 http://localhost:7071/ 能看到如下内容就代表项目搭建成功,图中红色的表示我们关闭了 Eureka 保护模式,在网络波动的情况下 Eureka Server 可能无法及时的保护客户端实例

Eureka Server UI

你好 Eureka Client

搭建一个 Eureka Client 也是相当容易的,只需要两个小小的依赖即可完成。

依赖

1
2
3
4
5
6
7
8
9
10
11
<!-- 此处我只给出了 Eureka Server 需要用到的包依赖,
为了篇幅考虑 spring-boot-starter-parent 及 spring-cloud-dependencies
并未将其粘贴出来,有需要的可以点击文末的 GITHUB 连接进去 copy -->
<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>

配置文件

下面罗列一部分需要注意的配置项,需要注意的都已经写好相关说明,更多配置可以参考 EurekaInstanceConfigBean 、 EurekaClientConfigBean 、 InetUtilsProperties 以下配置适用于大部分情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server:
port: 7072
# 如果不写 Eureka Server 中的界面中 Application 就会是 Unknown 尽量写
spring:
application:
name: eureka-client
cloud:
inetutils:
# 忽略指定网卡(支持正则),假设你的电脑有 VM 那么该选项是非常有用的一个选项
ignored-interfaces: #忽略 docker0 网卡以及 veth 开头的网卡
- docker0
- veth.*
preferred-networks: # 使用指定网络地址,选择 eth0 网卡,当然也可以直接写 IP (192.168)
- eth0
eureka:
instance:
# 此处建议写,不写默认是机器名
prefer-ip-address: true
# 优先级小于 application.properties ,如果你想知道当前注册上去的版本必须使用 application.properties 中的配置写法
# 因为 bootstrap.yml 最早初始化,那时候还无法读取到 pom.xml 中的属性
instance-id: ${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}}
# ip-address 强行指定此实例 IP ,不是很推荐,绝大多数情况 prefer-ip-address 与 preferred-networks 配合都够用了
client:
service-url:
# 划重点:此处的 defaultZone 千万别写成 default-zone
defaultZone: http://localhost:7071/eureka/

扩展知识

如果你觉得 Eureka Server UI 中默认显示的 instance-id 让你看着不爽,你可以试着在根目录下创建一个 application.properties 填写如下内容,因为Spring Cloud 和 Spring Boot 启动装载的配置有优先级之分,bootstrap 文件优先于 application 文件之前装载,所以一些配置只在 application 中生效

1
2
3
4
5
# 默认值:XB-201704242009:eureka-client:7072
# 修改前(bootstrap 配置的 instance-id):192.168.13.22:7072
# 修改后(application 配置的 instance-id):192.168.13.22:7072:0.0.1-SNAPSHOT
# 是不是后者更为直观,如果要用 @project.version@ 那么必须在 pom.xml 插件做一下小小的配置,具体请看 GITHUB ,当然如果你不需要显示 version 那么该文件你可以忽略
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}}:@project.version@

主函数

与往常 Spring Boot 启动类类似,不同的是多了一个 @EnableDiscoveryClient 注解,用来标识当前工程是Discovery Client。因为 Spring Cloud 提供了非常多的服务注册发现的组件,如 euerkazookeeperconsuletcd、所以为统一标识客户端身份,所以它用的是 @EnableDiscoveryClient 注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.battcn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /**
* @author Levin
*/
@EnableDiscoveryClient
@SpringBootApplication
public class MyEurekaClient { public static void main(String[] args) {
SpringApplication.run(MyEurekaClient.class, args);
}
}

Eureka Server UI

最新文章

  1. mac 安装brew
  2. 我的ORM汇总
  3. Winform无边框窗体的移动和阴影
  4. 颜色线性渐变-CAGradientLayer
  5. [Unity3D] 和Unity3D的一些事
  6. IntelliJ IDEA 15激活
  7. wordpress使用video.js与七牛云存储实现无广告视频分享应用
  8. javascript 命名空间的实例应用
  9. Android Support v4,v7,v13
  10. Python 学习日志(一)
  11. JavaScript&ldquo;闭包&rdquo;精解
  12. STM32通过FSMC驱动3.2寸液晶屏实现的音乐频谱
  13. noip借教室 题解
  14. 方法的重写与重载的区别(Override与Overload)。重载的方法是否可以改变返回值的类型
  15. Docker 学习5 Docker容器网络
  16. js 变量作用域
  17. delphi 多线程之System.TMonitor (续一)
  18. Azure 认知服务 (1) 概述
  19. 学习 swift (1)
  20. Mac 硬盘中各个文件夹详解

热门文章

  1. Java实现 LeetCode 260 只出现一次的数字 III(三)
  2. Java实现 LeetCode 121 买卖股票的最佳时机
  3. Java实现 蓝桥杯 算法提高最小方差生成树
  4. char 型变量中能不能存贮一个中文汉字?为什么?
  5. windows10+office2019各版本激活密钥
  6. hql 转 sql
  7. iOS/swift 单选框和复选框
  8. 恕我直言你可能真的不会java第1篇:lambda表达式会用了么?
  9. js银行卡四个数字一个空格
  10. Android Studio出现:Cause: unable to find valid certification path to requested target问题解决