微服务⼊门⼆:SpringCloud(版本HoxtonSR6)
⼀、什么是SpringCloud
1、官⽅定义
1)官⽅定义:springcloud为开发⼈员提供了在分布式系统中快速构建⼀些通⽤模式的⼯具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线)。分布式系统的协调导致了锅炉板模式,使⽤springcloud开发⼈员可以快速地建⽴实现这些模式的服务和应⽤程序。
2)springcloud是⼀个含概多个⼦项⽬的开发⼯具集,集合了众多的开源框架,他利⽤了spring boot开发的便利性实现了很多功能,如服务注册,服务注册发现,负载均衡等,springcloud在整合过程中主要是针对Netflix开源组件的封装,springcloud的出现真正的简化了分布式架构的开发。netflix是美国的⼀个在线视频⽹站,微服务业的翘楚,他是公认的⼤规模⽣产级微服务的杰出实践者,netflix的开源组件已经在他⼤规模分布式微服务环境中经过多年的⽣产实战验证,因此springcloud中很多组件都是基于netflix组件的封装。
2、核⼼架构及其组件
1)核⼼组件说明
eureka/consul/nacos(alibaba):服务注册中⼼组件
rabbion 、openfeign:服务负载均衡和服务调⽤组件
hystrix 、hystrix dashboard:服务断路器和服务监控组件
zuul/gateway:服务⽹关组件
config:统⼀配置中⼼组件
bus:消息总线组件
3、环境搭建
1)版本命名
springcloud是⼀个由众多独⽴⼦项⽬组成的⼤型综合项⽬,原则每个⼦项⽬有不同的发布节奏,都维护⾃⼰发布版本号。为了更好的管理springcloud的版本,通过⼀个资源清单BOM(bill of materials),为了避免与⼦项⽬的发布好混淆,所以没有采⽤版本号的⽅式,⽽是通过命名的⽅式。这些名字是按字母顺序排列的。当单个项⽬的点发布累积到⼀个临界量,或者其中⼀个项⽬中有⼀个关键缺陷需要每个⼈都可以使⽤时,发布序列将推出名称以“.SRX”结尾的“服务发布”,其中“x”是⼀个数字。
2)(springboot ,springcloud)
3)环境搭建(所有springcloud项⽬都要准备以下内容)
(1)⾮⾃创⽗项⽬
新建⼀个空项⽬,然后按下述⽅式建模块。(如下左图结构)
说明
springboot RELEASE、springcloud Hoxton SR6、java8+、maven3.3.6+、idea2020+
创建springboot模块
指定版本为2.2.5版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
引⼊springcloud的版本管理
<properties>
<!--springcloud具体版本号-->
<spring-cloud.version>Hoxton.SR6</spring-cloud.version>
</properties>
<!--全局管理springboot版本,并不会引⼊具体依赖-->
<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>
(2)⾃创⽗项⽬
将上述的依赖整合到⼀个⽗项⽬中,然后后续以此为基础创建⼦模块,并引⼊该⽗项⽬。(如下右图结构)使⽤⽅式
将⽗项⽬的(groupId、artifactId)放⼊⼦项⽬的<parent/>中,同时在⽗项⽬中添加<modules>
⽗:
<modules>
<module>
test3
</module>
</modules>
⼦:
spring教学视频<parent>
<groupId>com.icucoder</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
⼆、服务注册中⼼
1、基本内容
1)概念
所谓的服务注册中⼼就是在整个微服务架构中单独提出⼀个服务,整个服务不完成系统的任何业务功能,仅仅⽤来对整个微服务系统的服务注册和服务发现,以及对服务健康状态的监控和管理功能。
2)功能
可以对所有的微服务的信息进⾏存储,如微服务的名称、ip和端⼝等
可以在进⾏服务调⽤时通过服务发现查询可⽤的微服务列表及⽹络地址进⾏服务调⽤
可以对所有的微服务进⾏⼼跳检测,如发现某实例长时间⽆法访问,就会从服务注册表移除该实例。
3)常⽤的注册中⼼
Eureka(Netflix)、Consul、Zookeeper、以及阿⾥巴巴的Nacos组件。这些注册中⼼在本质上都是⽤来管理服务的注册和发现以及服务状态的检查的。
2、使⽤⽅法
1)
(1)简介
Eureka是Netflix开发的服务发现框架,本⾝是⼀个基于REST的服务。springcloud将它集成在其⼦项⽬spring-cloud-netflix中,以实现springcloud的服务注册和发现功能。
Eureka包含两个组件:Eureka Server和Eureka Client。
(2)开发Eureka Server
创建项⽬并引⼊eureka server依赖
<!--⼀引⼊Eureka Server依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
编写配置application.properties
#指定服务端⼝
server.port=9000
#指定服务名称唯⼀标识
spring.application.name=eurekaserver
#指定服务注册中⼼的地址
eureka.client.service-url.defaultZone=localhost:9000/eureka
开启Eureka Server⼊⼝类加⼊注解
@SpringBootApplication
@EnableEurekaServer
public class Eurekaserver9000Application {
public static void main(String[] args) {
SpringApplication.run(Eurekaserver9000Application.class, args);
}
}
访问: localhost:9000/
说明:
出现上述问题的原因:Eureka组件包含Eureka server和Eureka client。server是⼀个服务注册中⼼,⽤来接收客户端的注册。client的特性会让当前启动的服务把⾃
⼰作为Eureka的客户端进⾏服务中⼼的注册,当项⽬启动时服务注册中⼼还没有创建好,所以不到服务的客户端组件就直接报错了,当启动成功服务注册中⼼创建好了,⽇后client也能进⾏注册,就不会报错了。
关闭⾃⼰注册⾃⼰:
#不再将⾃⼰同时作为客户端进⾏注册(⽤在eureka server上)
ister-with-eureka=false
#关闭作为客户端时从Eureka server获取服务信息
eureka.client.fetch-registry=false
(3)开发Eureka Client
创建项⽬并引⼊eureka client依赖
<!--⼀引⼊Eureka Client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
编写配置application.properties
#指定服务端⼝
server.port=8000
#指定服务名称唯⼀标识
spring.application.name=eurekaclient
#指定服务注册中⼼的地址
eureka.client.service-url.defaultZone=localhost:9000/eureka
开启Eureka client⼊⼝类加⼊注解
@SpringBootApplication
@EnableEurekaClient
public class Eurekaclient8000Application {
public static void main(String[] args) {
SpringApplication.run(Eurekaclient8000Application.class, args);
}
}
(4)eureka⾃我保护机制
默认情况下,如果eureka server在⼀定时间内(默认90s)没有接收到某个微服务实例的⼼跳,eureka server将会移除该实例。⾃我保护机制是:eureka server 在运⾏期间会去统计⼼跳失败⽐例在15分钟之内是否低于85%,如果低于85%,eureka sever会将这些实例保护起来,让这些实例永不过期。
在eureka server端关闭⾃我保护机制
#关闭⾃我保护
able-self-preservation=false
#超时3s⾃动清除
eureka.server.eviction-interval-timer-in-ms=3000
微服务修改减短服务⼼跳时间
#⽤来修改eureka sever默认接受⼼跳的最⼤时间,默认是90s
eureka.instance.lease-expiration-duration-in-seconds=10
#指定客户端多久向eureka server发送⼀次⼼跳,默认是30s
eureka.instance.lease-renewal-interval-in-seconds=5
2)
(1)简介
consul是⼀个可以提供服务发现、健康检查、多数据中⼼、key/value存储等功能的分布式服务框架,⽤于实现分布式系统的服务发现与配置。与其他分布式服务注册⽅案相⽐,使⽤起来也较为简单。consul⽤golang实现,因此具有天然可移植性(⽀持linux、windows和mac os x)。安装包仅包含⼀
个可执⾏⽂件,⽅便部署。(2)
下载,解压后执⾏命令:
linux:执⾏consul agent -dev -client 0.0.0.0 -ui 启动consul服务器
windows:执⾏ agent -dev启动consul服务器
然后访问:localhost:8500
(3)开发Consul Client
创建项⽬并引⼊consul依赖
<!--引⼊consul依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
编写application.properties配置
server.port=8100
spring.application.name=consulclient
#注册consul服务的主机
sul.host=192.168.227.134
#注册consul服务的端⼝号
sul.port=8500
#关闭consul的服务健康检查(不推荐)这⾥开启
ister-health-check=true
#指定注册的服务名称默认就是应⽤名
sul.discovery.service-name=${spring.application.name}
启动服务查看consul界⾯服务信息
(4)consul开启健康监控检查
默认情况下consul监控健康是开启的,但是必须依赖健康监控依赖才能正确监控健康状态,所以直接开启会显⽰错误,引⼊健康监控依赖之后服务正常。
<!--consul监控健康依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3)zookeeper
todo
4)nacos
todo
3、不同注册中⼼区别
1)CAP定理
CAP定理⼜称为CAP原则,指的是在⼀个分布式系统中,⼀致性(Consistency)、可⽤性(Availability)、分区容错性(Partition tolerance)。CAP原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
(1)⼀致性:在分布式系统中的所有数据备份,在同⼀时刻是否同样的值。(等同于所有节点访问同⼀份最新的数据副本)
(2)可⽤性:在集中⼀部分接地那故障后,集整体是否还能响应客户端的读写要求。(对数据更新具备⾼可⽤性)
(3)分区容错性:就是⾼可⽤性,⼀个节点崩了,并不影响其他的节点(100个节点,挂了⼏个,不影响服务,越多机器越好)
2)Eureka特点
Eureka中没有使⽤任何的数据⼀致性算法保障不同集间的server的数据⼀致,仅通过数据拷贝的⽅式争取注册中⼼数据的最终⼀致性,虽然放弃数据⼀致性但是换来了server的可⽤性,降低了注册的代价,提⾼了集运⾏的健壮性。
3)Consul特点
基于Raft算法,Consul提供强⼀致性的注册中⼼服务,但是由于Leader节点承担了所有的处理⼯作,势必加⼤了注册和发现的代价,降低了服务的可⽤性,通过Gossip协议,Consul可以很好地监控Consul集的运⾏,同时可以⽅便通知各类事件,如Leader选择发⽣、server地址变更等。
4)zookeeper特点
基于Zab协议,Zookeeper可以⽤于构建具备数据强⼀致性的服务注册于发现中⼼,⽽与此相对地牺牲了服务的可⽤性和提⾼了注册需要的时间。
组件名语⾔CAP⼀致性算法服务健康检查对外暴露接⼝Spring Cloud集成
Eureka java ap⽆可配⽀持HTTP已集成
Consul go cp Raft⽀持HTTP/DNS已集成
Zookeeper java cp Paxos⽀持客户端已集成
三、服务间通信⽅式
⼀个服务开启多个端⼝:
在springcloud中服务间调⽤主要是使⽤http restful⽅式进⾏服务调⽤。
1、基于RestTemplate的服务调⽤
1)说明
spring框架提供的RestTemplate类可⽤于在应⽤中调⽤rest服务,它简化了与http服务的通信⽅式,统⼀了RESTful的标准,封装了http链接,我们只需要传⼊url及返回值类型即可。相较于之前常⽤的HttpClient,RestTemplate是⼀种更优雅的调⽤RESTful服务的⽅式。
2)⽰例
商品服务提供⼀个接⼝:localhost:8200/product/showMsg
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论