导图社区 Spring Cloud
基于 <深入理解SpringCloud与微服务架构>这本书 提取干货 进行总结 完全不懂可以直接进行架构一个SpringCloud项目.
编辑于2018-10-18 03:14:17Spring Cloud
2 理解微服务
2.1 软件架构演进
软件架构的发展经历了重单体结构,垂直架构,SOA架构到微服务架构的
2.1.1 单体架构
后期用户过度把一个项目部署到多个服务器上就叫做集群部署
集群原因
一台机器无法适应多个用户访问
单体架构的特点
1 所有功能模块集成到一个项目工程上
2 所有的功能打成一个war包部署到服务器上
3 应用与数据库分开部署
4 通过部署应用集群和数据库集群提高系统性能
单体架构的缺点
随着后期数据量模块的复杂化 缺点会暴露的越来越多
因为一个模块并发量高 而整个项目进行集群 那么对系统资源的浪费
单体架构的优点
项目开始阶段 部署和开发比较高效
2.1.2 垂直架构
垂直架构的特点
1 把一个大项目拆分成一个个单体的项目
2 项目和项目之间有数据沉淀 耦合性很大
3 项目上的接口多为数据同步功能
缺点
1 全部功能集成在一个工程上,对于大型项目不易开发 扩展及维护
2 系统功能扩展只能通过集群节点,成本高,有瓶颈
优点
项目架构简单,前期开发成本低,周期短,小项目首选
2 通过单体拆分原来的单体项目不至于无限扩大
3 不同的项目可采用不同的技术
2.1.3 SOA架构
特点
1 基于SOA 的架构思想将重复公用的功能抽取为组件,以服务的方式给各个系统提供服务
2 各个项目与服务器采用 webservice rpc 等方式进行通讯
3 ESB企业服务总栈作为项目与服务之间的通信桥梁
优点
1 将重复的功能抽取为服务,提高开发效率,提高系统的可重用性,可维护性
2 可以针对不同的服务特点制定集群及优化方法
3 采用ESB 减少系统中接口的耦合
缺点
1 系统与服务的界限模糊,不利于开发及维护
2 虽然采用ESB 但服务的接口协议不固定,种类繁多,不利于系统维护
3 抽取的服务粒度过大,系统和服务耦合性高
2.1.4 什么是微服务
特点
1 将系统层完全独立出来,并将服务层抽取为一个个的微服务
2 微服务遵循单一原则
3 微服务之间采用restful等轻量级协议传输
优点
1 服务拆分力度更细,有利于资源的重复利用,提高开发效率
2 可以更加精准的制定每个服务的优化方案,提高性能可维护性
3 微服务架构采用去中心化思想,服务之间采用restful 等轻量协议通信,相比ESB 更轻量
4 适用与互联网,产品迭代周期更短
缺点
1 微服务过多,服务治理成本高,不利于系统维护
2 饭不是系统开发成本高,对团队挑战大
2.2 为什么使用微服务
降低研发成本 独立的系统拆分成细小的服务 每个小服务运行独立的进程 之间采用http 轻量协议 传输数据 每个服务都具有独立性强耦合性高的特点 实现了单个服务的高内聚 服务之间的低耦合 这种架构就是为服务架构
就是吧一个系统拆分成多个细小的服务 服务遵循单一 原则 轻量级协议 提供接口让外部调用
2.3 Spring Cloud 技术栈
2.3.1 微服务技术栈
负载均衡 网管路由:
高可用,集群部署,校检,请求转发,服务集成
服务治理
服务注册,发现
容错
避免雪崩
监控跟踪
监控资源利用 服务相应 容器资源利用情况
消息总线
消息队列,异步通信
2.3.2 Spring Cloud 是什么
Spring cloud 是未开发人员构建为服务绞股提供我那成解决方案, SpringCloud是若干个框架的集合 包含二十多个子项目 提供服务治理 服务网管 智能路由 负载均衡 短路有 监控跟踪 分别怒视消息队列 配置管理等淋雨的解决方案
3 开发环境
3.1 java 8
3.2 Maven
3.3 Spring Boot
Spring Cloud 是基于 SpringBoot 构建的
4 服务治理
4.1 什么是服务治理
为服务的治理就是维护成本巨大 服务治理解决此问题产生的 服务自已维护微服务作为服务提供放主动想服务治理中新注册 服务的消费方通过服务中兴治理查询要调用的服务
服务自维护 自己维护自己
服务的注册
提供服务
服务的发现
调用服务
4.2 SpringCloud Eureka
服务端
客户端
4.3 架构
微服务 A
去eureka注册
其他服务去eureka寻找服务
特点
微服务A 如果下线测去 eurkea发送下载 eurkea 如果发现一段时间没有发送心跳就认为微服务已经死了 不再能搜索到
4.4 开发部署Spring Colod
4.4.2 开发部署 Eureka Server
1 创建Spring boot 工程
2 在poom 中天将 Springboot Spring Cloud spring Sureka
3 两台erureka 互相注册到对方离去达到高可用
4 通过名称进行找寻服务
深入理解 SpringClocd与微服务构建
第一章 分布式
1.2 微服务
1.2.1 什么是微服务
1 按业务划分为一个独立运行的程序,及单元
2 服务之间用http协议相互通信
3 自动化部署
4 可以用不同语言
5 用不同的存储技术
6 服务集中化管理
7 微服务是一个分布式系统
8 熔断机制
说明
并发化后加入一个线程出现问题形成堵塞 会影响其他用户线程的进来 导致问题越来越大 熔断是给他设置个阀门 几次出现问题有就马上返回以免影响后续
1.3 微服务的不足
1.3.1 微服务的复杂度
架构上比较复杂,如果一个底层的服务有了变化可能会影响其他有关联的服务
1.3.2 分布式事务
因为分布式所以各个服务的业务都是独立的 所以业务上少用分布式事务
1.3.3 服务的划分
领域区分设计这个概念 中国现在还没有公司去运用其
1.3.4 服务的部署
1.4 微服务和SOA的关系
微服务将复杂的业务组件化,实际上是一种面向服务的思想提现,对于微服务 他是soa的一种实现 但是比ESB实现SOA更加轻便,敏捷和简单
1.5 微服务的设计原则
软件的设计是循序渐进的所以一开始不应该设计为微服务
2 微服务固然有有点但是需要更多的资源 服务器 技术人员 解决问题的方案
3 业务量增大 可以考虑数据库读写分离 加缓存 加均衡器
4 在发展就需要分布式 当前架构无法适应 可以考虑更换架构
5 微服务的三大难题
1 故障的传播性
2 服务器的划分
3 分布式事务
6 注意
不管是什么微服务 如果事务失败还是需要人为的去数据统一
7 设计原则 应该是渐进性的 符合业务发展而发展
第二章 Spring Cloud 简介
2.1 微服务应该具备的特点跟功能
特点和功能
特点
1单个服务代码量小 业务单一 易于维护
2 每个微服务有自己的独立的基础组建 例如数据库缓存和运行独立的进程
3 微服务之间用HTTP协议或消息组建,基本容错能力
4 有一套服务治理解决方案,服务之间不耦合 可以随时加入和剔除
5 单个微服务能够集群化部署,并且有负载均衡能力
6 有完整的安全机制, 用户验证,权限验证,资源保护
7 微服务链路有追踪功能
8 有一套完整的事实日志系统
功能
1 服务的注册和发现
2 服务的负载均衡
3 服务的容错
4 服务的网管
5 服务的配置和统一管理
6 链路的追踪
7 实施日志
2.1.1 服务的注册与发现
1 服务注册到服务中心
2 消费者去发现服务并使用
2.1.2 服务的负载均衡
原因
因为用HTTP去通讯 可是呢网路噢不稳定为了保证稳定所以忘完单元需要集群部署
负载均衡
所有的服务器去服务中心注册 ip地址跟其他信息 同时每个服务器也会获取到所有服务注册列表信息 服务消费者继承负载均衡组建 获得所有服务器信息然后负载均衡服务中心通过一定的侧率去分配服务到具体的服务器 向该实例进行服务消费 这就是负载均衡
特点
1 定时查看每个服务的心跳
2 服务注册中心本身也可以集群
2.1.3 服务的容错
如果在高并发情况下一个请求除了问题占用了一个服务器而导致连锁丹樱到这线程资源消耗殆尽 所以必须马上 当一个线程除了问题要马上返回不要影响其他的操作
熔断器
一个服务科能是 a-b-c
当a 出现问题马上返回不让其继续到b c
请求过来 失败次数如果大于阀值 那就关闭状态迅速返回
作用
将资源隔离 如果某个接口出现问题会进行隔离不会影响其他接口,隔离后马上执行失败流程以免阻塞
服务降级功能 当服务大量涌入后 如果大于服务器设置的最大处理,熔断器就会被打开进行服务降级,以免因服务器负载过高而出现故障
自我修复能力
2.1.4 服务器网关
内部服务器不直接对外提供接口 而是把内部服务隐藏起来 外界还以为是一个服务在提供服务
重要意义
1 服务app接口 资源统一聚合 对外暴露
2 网关对可以做一些用户的身份认证,权限认证,防止非法入侵
3 实现监控,日志输出,对请求进行记录
4 流量监控 在高流量下,可以进行降级
5 api接口重内部分离出来,方便测试
注意
使用网关需要做高可用 否则网关就是架构中的瓶颈
zuul
nginx
2.1.5 服务器配置的统一管理
1 Config Server 读取配置文件的信息可以使本地仓库也可以是GIT
2 配置服务启动后 读取配置文件信息然后放在配置服务的内存中
3 启动服务A,B的时候 服务 A《》B制定配置服务读取配置信息,服务A《》B《像配置服务读取配置信息》
4 当服务配置信息需要修改和修改后,想配置服务发送post请求进行刷新,这时候服务A,B向配置服务重新读取配置文件
2.1.6 服务链路追追踪
一个微服务有很多服务单元,因为里业务比较复杂互相嵌套 所以想定位一个问题很难 用追踪方式 现在的链路追踪组建有 Dapper Zipkin Eagleeye
2.2 Spring Cloud
2.2.1 简介
基于Spring Cloud 基于Spring Boot 的web框架,简化开发和部署过程,简化配置和依赖管理 通过起步依赖和Servlet容器能够迅速开发一个Web工程 继承了Springboot 提高开发和部署的效率
子主题
通过一列的安全组件和框架迅速搭建分布式微服务系统,SpringCloud通过包装其他技术框架来实现其他技术
2.2.2 常用组建
1 服务注册和发现组建 Eurka
2 熔断组建 Hystrix
除了熔断以外还可以服务降级 服务限流 健康监测 以及熔断健康的API接口
3 负载均衡组建 Ribbon
通常跟 Eurka zuul RestTemplate Feign配合使用
4 路由网关 Zuul
过滤功能 内部API接口 统一像外部暴露对用户进行权限判断和安全验证作用 同时可以输出到安全日志
5 spring Cloud Config
配置管理服务器 包含serverClient端
6 Spring Cloud Security
用户验证和权限认证的,单服务使用是很少见的
7 Spring Cloud Sleuth
分布式链路追踪组建
8 Spring Cloud Stream
数据流操作包可以分装消息中间件 利用它可以实现消息的消息的接受和发送
第三章 构建微服务的准备
3.2.2 用idea创建一个SpringBoot工程
1 Spring Initializr
2 new
3 输入 Group
4 Artifact
5改变单实例
在服务器启动上 打开配置界面把Siggle instance onle 去掉 然后在application.yml和 server.port 端口中改变不同的端口号分别启动就行l
3.3 构建工具Meven的使用
3.3.1 Maven 简介
3.3.2 Maven的安装
3.3.3Maven的核心概念
核心是一个pom文件 xml格式里边包含 jar,插件 构建文件等
1 pom文件 是Maven的核心,所有依赖插件都有pomw文件统一管理
2 下载依赖jar 到本地仓库
maven命令执行的时候 首先检查pom中依赖
2 本地如果不存在jar 默认去中央仓库下载依赖jar
3 中央仓库地址为 http://repol.maven.org/maven2/
4 依赖下载完后会存放早本地仓库 如果不成功册该命令执行不会通过
5 执行构建的生命周期 为构建阶段,构建目标 共同构成Maven的生命周期
6 执行构建插件 插件可以方便的执行构建的各个极端,也可以用插件实现一些额外功能
3.3.4 编写Pom文件
解析
1 <?xml version="1.0" encoding="UTF-8">
当前xml 的版本 跟编码格式
2 <project> 根元素
01 <modelVersion>4.0.0</modelVersion> pom版本
02 <groupId>com.nestpu</groupId> 代表公司组织名称
03 <artifactId>nestpu-service</artifactId> 代表全局唯一ID
04 <version>0.0.1-SNAPSHOT</version> 是指该项目的版本
注意: 只有 03 04 05完全一致才能找到 jar包
05 <parent> 标签用于指定父类 pom
06 <properties> </properties> 声明一些常量
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
java 版本
07 <dependencies> </dependencies> 依赖的根元素
<dependency> </dependency>里边包含多个具体的跟元素
01 <groupId>com.nestpu</groupId> 代表公司组织名称
02 <artifactId>nestpu-service</artifactId> 代表全局唯一ID
03 <version>0.0.1-SNAPSHOT</version> 是指该项目的版本
注意; 03 可以省去 如果省去就代表采用默认的发布版本
08 <build></build> 构建标签
01 <plugins></plugins> 插件组
<plugin></plugins> 插件
01 <groupId>com.nestpu</groupId> 代表公司组织名称
02 <artifactId>nestpu-service</artifactId> 代表全局唯一ID
03 <version>0.0.1-SNAPSHOT</version> 是指该项目的版本
注意; 03 可以省去 如果省去就代表采用默认的发布版本
3.3.5 Maven 构建项目的生命周期
01 validate
验证工程的完整性
23 deploy
提交到远程仓库
03 generate-sources
生成源码
04 process-source
处理远吗
05 generate-resources
生成所有源码
06 process-resources
处理所有源码
07 compile
编译
08 prorcess-classes
处理所有class文件
09 generate-test-sources
生成测试源码
10 process-test-sources
处理测试源码
11 generate-test-reources
生成所有测试源码
02 initalize
初始化
13 test-compile
测试编译
14 process-test-classes
处理所有测试class文件
15 test
测试
16 prepare-package
预打包
17 package
打包
18 pre-integration-test
预集成测试
19 integration-test
集成测试
20 post-integration-test
完成集成测试
21 verify
验证
22 install
安装到本地仓库
12 process-test-resources
处理所有测试源码
3.3.6 常用的Maven命令
01 mvn clean 删除 target下的所有文件
02 mvn package 将工程打成jar包
内部执行的步骤
01 验证
02 编译代码
03 处理代码
04 生成资源文件
05 生成jar 包
06 测试
03 mvn package-Dmaven.test.skip=true
打包时候跳过测试
04 mvn compile
编译工程代码不生成jar包
05 mvn insatll
mvn package 所有过程 jar包安装到本地仓库
06 mvn spring-boot:run
使用spring-boot插件 该命令执行检查工程代码是否编译 如果没有编译 县编译
07 mvn test
测试
08 mvn idea:idea
生成idea项目
09 mvn jar
只打jar包
10 mvn vaildate
检查资源的完整性
第四章 开发框架Spring Boot
4.1 SpringBoot 简介
简化配置快速开发
4.1.1 SpringBoot的特点
1自动配置
2 岂不依赖
3 ACtutor 对运行的状态的监控
4.1.2 Spring Boot的优点
简化开发又包含了安全 健康 容器位置配置等功能
4.2 用IDEA构建SpringBoot 工程
4.2.0 步骤
1 new Project
2 Spring lnItializr
3 填写 group 一般公司名称倒写
3 artiact 项目名称 唯一标示
4 web
4.2.1 项目结构
src
main
java
pack
SpringbootApplication 程序启动类
resouces 为资源管理家
statice
静态资源
templates
模版资源
application.yml
配置资源
pom 依赖管理文件
4.2.2在SpringBoot工程中构建Web
starter-web
起步依赖
starter-test
起步依赖
SpringbootApplication
@SpringBootAppliaction
包含 @SpringBootConfiguration
包含 @EaanbleAuto
包含 @ComponentSan
作用 包扫描 诶只 和自动配置功能
@RestController
包含
@Controller
@ResponseBody
@RequstMapping
请求地址的URl映射
4.2.3 SpringBoot 测试
挂起 因为看不明白
4.3 SpringBoot配置文件详解
4.3.1 自定义属性
application.yml 配置文件
my: name: zhangsan
实例中赋值
@Value("${my.name}") private String name;
注意: 因为格式要求 在配置中 属性跟值要用: 和空格隔离
4.3.2 将配置文件的属性给实体类
@ConfigurationProperties(prefix = "my")
表示该类是配置属性类 调用的配合文件中my下边的属性
@Component
表示把当前类作为一个Bean 注入到容器中 就可以去自动配置了啊
调用 @EnableConfigurationProperties({my.class})
表示在Controller 想使用注入那就要这个标签开启 {要用的注解实体类}
4.3.3 自定义配置文件
有一个配置文件名字为test.properties
@Configuration @PropertySource (value = ” classpath : test . p r operties ") @Configurat i onProperties (prefix = ” com . forezp ”)
实体类中调用的是里边com.forezp的属性
4.3.4 多个环境配置文件
application-test.properties-一测试环
application-dev.properties一一’开发环境
application-prod.properties-一生产环境。
spring: profiles: active: dev
代表当前使用dev这个配置文件
4.4 运行状态监控 Actator
1 导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2 配置
management: server: port: 9001 endpoints: web: exposure: include: refresh,health,info,env,mappings
注 include: 里边是暴漏的接口
3访问
http://localhost:9001/actuator/mappings
4 API
1 autoconfig
提供自动配置报告记录哪些通过了哪些没有
13 metrices
获取应用程序的度量信息 内存 HTTP的请求计数 等
3 dump
获取线程活动的快照
4 env{name}
根据名称获取制定环境的属性值
5 heath
应用程序的健康指标
6 info
获取应用程序的信息
2 configgrops
描述配置的属性如何注入到Bean
8 metrices{name}
获取程序制定民称的度量信息
9 shutdown
关闭应用程序 需要endpoints.shutdown.enabled 设置为true
10 trace
提供基本的HTTP请求跟踪信息 时间错 http头等
11 beans
找到上下文所有的Bean
12 env
获取全部环境参数
7 mappings
描述所有URL跟控制器的映射关系
4.5 SpringBoot 整合 JPA
1 依赖
dependency> <groupld>org.springframework . boot</groupld> <artifactld>spring-boot-starter- data-jpa </artifactld> </dependency>
<dependency> <groupld>org.springframework . boot</groupld> <artifactld>spring-boot-starter- data-jpa </artifactld> </dependency
2 配置
jpa: hibernate: ddl-auto: create # 第一次建表是创建 其余是更改 createOrUpdate show-sql: true # 是否显示配置 database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
3 实体类
@Entity
表示是实体类
4 常见Dao
extends JpaRepository<User,String>
4.6 SpingBoot 整合Redis
1 导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>2.0.8.RELEASE</version> </dependency>
2 配置
#redis redis: host: 127.0.0.1 port: 6379 password: 123456 database: 1 pool: jedis: pool: max-active: 8 max-wait: -1ms max-idle: 500
3 写RedisDao
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Repository; import java.util.concurrent.TimeUnit; @Repository public class RedisDao { @Autowired private StringRedisTemplate template; public void setKey(String key,String value){ ValueOperations<String, String> ops = template.opsForValue(); ops.set(key, value,1,TimeUnit.MINUTES);//设置过期的时间为1分钟 } public String getValue(String key){ ValueOperations<String, String> ops = template.opsForValue(); String s = ops.get(key); return s; } }
4.7 SpingBoot 整合 Swgger2
1 依赖
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.6.1</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.6.1</version> </dependency>
2 配置类
注意:要用配置@Configuration 说明是个配置类
3 方法上标注
@ApiOperation(value="获取用户详细信息", notes="根据url的id来获取用户详细信息") @ApiImplicitParam(name = "username", value = "用户姓名", required = true, dataType = "String", paramType = "path") @RequestMapping(value = "findUserByusername", method = RequestMethod.GET) @ApiParam(name = "pawword" ,value = "密码") public User findUserByusername( String username){
4 打开地址
http://localhost:8080/swagger-ui.html
5 注解说明
1 @API
修饰真个类
10 @ApiParamsImplicit
多个请求参数
3 @ApiParam
单个参数描述
参数
tags 对这个类说明阐述
4 @piModel
用对向来接收参数
5 @ApiProperty
用对象接受参数时候描述对象中参数的一个对象
2 @ApiOperation
描述类中的方法
7 @ApiResponses
http 响应的一个整体描述
8 !Apignore
表示忽略当前的APi
@ApiError
发生错误的时候返回的信息
9 !piParamImplicit
一个请求参数
6 ApiResponse
Http相应的一个描述
第五章 服务注册和发现Eureka
5.1 Eureka 简介
是一个服务注册和发现的组建
5.1.1 分为 注册中心 EurekaServer
2 Eureka Client 客户端
5.1.2 为什么选择 Eureka
功能
1 负载均衡 Ribbon
2 熔断器 Hystrix
5.1.3 Eureka 的基本架构
1 Register Service 服务注册中心 就是 Eureka Server
2 Provider Service 服务提供方 就是EurekaClient
3 Consumer Service 服务消费方 Eureka Client 消费服务
5.2 Sureka Server
1 注意
总有冲突 所以就直接用这个配置好的
2 依赖引入
<?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> <groupId>com.nestpu</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-cloud-eureka</name> <description>Demo project for Spring cloud eureka</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.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> <spring-cloud.version>Dalston.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-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>
3 配置
#端口号修改为8000 server: port: 8000 #eureka实例,不注册自己 #所以 registerWithEureka=false #不获取注册信息 fetchRegistry=false eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ spring: application: name: eureka-server
4 启动配置
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
5.3 Eureka Client
1 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> <groupId>com.eureka</groupId> <artifactId>demo-client</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>demo-client</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.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> <spring-cloud.version>Dalston.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-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>
2 配置
server: port: 8761 eureka: client: service-url: defaultZone : http://localhost:8000/eureka/ spring: application: name: eureka-client
3 启动类
@SpringBootApplication @EnableEurekaClient public class DemoClientApplication { public static void main(String[] args) { SpringApplication.run(DemoClientApplication.class, args); } }
5.4 源码解析 Eureka
5.4.1 Eureka的一些概念
1 Register 服务注册
当 Eureka Client 像Eureka server 去注册时候提供自己的IP 端口运行状态指标url地址等信息
2 Renew 服务续约
Eureka Client 没短30秒会像Eureka server 发送一次心跳 如果90秒 Eureka server 没有心跳 那么 Eureka sever 会将 Eureka client 实例会重实例中删除
注意: 官方建议不要修改 30秒的间隔市场
3 Fetch Registries 获取服务注册列表信息
1 Eureka Client 每隔 30秒会去Eureka server 去下载注册列表并缓存到本地
2 每次缓存的数据可能不同 Eureka Client 会自己处理
3 如果运行时候数据不同 那么Eureka Client 回去 Eureka server 再次去取
4 所有注册列表下载到本地都会自行压缩 压缩和没压缩的数据完全相同
5 Eureka server 和Eureka Client 进行通信会用json xml模式进行通讯 默认是 json格式
4 Cancel 服务下线
1 Eureka Client 会像 Eureka server 发送下线请求
2 发送请求后 客户端的实例降重server 列表中删除
注意;
1 下线请求不会自动完成 需要程序关闭时候调用 DiscoveryManager.getInstance().shutdownComponent();
5 Eviction 服务剔除