文章目录
一、springcloud介绍
spring cloud 是一系列框架的集合。SpringCloud是基于SpringBoot基础之上开发的微服务框架,SpringCloud是一套目前非常完整的微服务解决方案框架,其内容包含服务治理、注册中心、配置管理、断路器、智能路由、微代理、控制总线、全局锁、分布式会话等,都可以用 spring boot 的开发风格做到一键启动和部署。spring cloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 spring boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
使用 spring cloud 一站式解决方案能在从容应对业务发展的同时大大减少开发成本。
springcloud组件
SpringCloud netflix 核心组件:
- Eureka服务治理:注册中心,服务注册和发现
- Ribbon客户端负载均衡:负载均衡、请求重试
- Hystrix断路器:服务保护框架,服务降级、熔断
- Feign:基于ribbon和hystrix集成的声明式、模板化的HTTP客户端
- Zuul服务网关:在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。提供微服务的统一入口,并提供统一的权限验证。
SpringCloud config 分布式配置中心
hystrix dashboard 和 turbine: hystrix 微服务监控
bus:消息总线, 配置刷新
sleuth+zipkin:链路跟踪
微服务架构为什么选择使用springcloud?
- SpringCloud提供了一整套微服务解决方案(全家桶)
- 如果学习其他微服务框架(dubbo),需要整合其他框架帮你解决微服务问题。
分布式、微服务、云架构图
JAVA语言开发、跨平台、高性能、高可用、安全、服务化、模块化、组件化、驱动式开发模式
本文SpringCloud版本选用当前最新版
- SpringBoot:2.2.1.RELEASE
- SpringCloud:Hoxton.RC2
二、Eureka 服务治理
服务治理
在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
服务注册与发现
- 在服务注册与发现中,有注册中心
- 当服务器启动的时候,会把当前自己服务器的通讯地址等以别名方式注册到注册中心上。
- 另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后在实现rpc调用。
- 服务每30秒发送一次心跳数据;服务每30秒重新从eureka拉取注册表
- eureka连续三次收不到心跳数据,会认为微服务挂了
- 一个服务不可用时,eureka会进入保护模式,不删除该服务的注册信息
RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。
服务提供者:提供服务接口的
服务消费者:调用别人接口进行使用的
注册中心概念:存放服务地址相关信息(接口地址)
服务注册:将服务信息注册到注册中心上
服务发现:从注册中心上获取服务信息。
实现服务注册与发现的过程:
- 首先启动注册中心
- 再启动服务
- 服务启动,会把当前服务基本信息比如服务地址和端口以别名方式注册到注册中心上(首先会缓存在JVM中,默认情况Eureka没隔30秒更新一次服务调用地址)
- 消费者在调用接口的时候,是用服务别名去注册中心上获取实际rpc远程调用地址,每30秒重新从eureka拉取注册表
- 获取实际rpc远程调用到地址之后,在使用本地HTTPClient技术实现调用
Eureka与Zookeeper的区别
- 分布式原则:A:可用性;C:一致性。两个只能保证一个
- Eureka是AP,强调可用性
- Zookeeper是CP,强调一致性
- 集群:
- Eureka集群:对等结构
- Zookeeper集群:主从结构
Springcloud中支持以下三种注册中心:Eureka
、Consul(GO编写)
、Zookeeper
Dubbo常用:Redis
、zookeeper
搭建Eureka注册中心
-
创建eureka模块
-
配置依赖 pom.xml :
eureka-server
<?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 https://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.2.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.jt</groupId> <artifactId>eureka</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.RC2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </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> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> </project>
-
配置 application.yml:详细配置看下面的高可用集群
spring.application.name
:配置服务名server.port
:服务端口号spring.profiles
:特定的配置文件名eureka.instance.hostname
区分eureka 集群服务器eureka.server.enable-self-preservation
:eureka 的自我保护状态:心跳失败的比例,在15分钟内是否低于85%,如果出现了低于的情况,Eureka Server会将当前的实例注册信息保护起来,同时提示一个警告,一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据。也就是不会注销任何微服务eureka.client.register-with-eureka=false
:不向自身注册,默认为trueeureka.client.fetch-registry=false
:不从自身拉取注册信息,默认为trueeureka.instance.lease-expiration-duration-in-seconds
:最后一次心跳后,间隔多久认定微服务不可用,默认90秒
-
修改 hosts 文件,添加 eureka 域名映射
-
主程序启用 eureka 服务器:添加
@EnableEurekaServer
注解 -
启动,访问测试
搭建Eureka注册中心集群-高可用
在微服务中,注册中心非常核心,可以实现服务治理,如果一旦注册出现故障的时候,可能会导致整个微服务无法访问,在这时候就需要对注册中心实现高可用集群模式。
原理:
Eureka高可用实际上将自己作为服务向其他服务注册中心注册自己,这样就可以形成一组相互注册的服务注册中心,从而实现服务清单的互相同步,达到高可用效果。
- application.yml:使用spring.profiles属性配置不同的配置
spring:
application:
name: eureka-server
eureka:
server:
enable-self-preservation: false
---
spring:
profiles: eureka1
server:
port: 2001
eureka:
instance:
hostname: eureka1
client:
service-url:
defaultZone: http://eureka2:2002/eureka
---
spring:
profiles: eureka2
server:
port: 2002
eureka