1. 什么是Spring Cloud
Spring Could 是基于SpringBoot 实现的微服务架构开发工具,它利用Spring Boot 的开发便利性简化了分布式系统的开发,比如服务注册,服务发现,服务网关,服务路由,链路追踪,负载均衡、数据监控等,Spring Could 并不制造轮子,而是将市面上开发比较好的模块集成进去,进行封装,从而减少模块的开发成本。
2. Spring Could的组件
3. Spring Could 的优缺点
3.1 优点
1. 耦合度较低,不会影响其他的模块开发
2. 减轻团队的成本,可以并行开发,不用关注其他人怎么开发,先关注自己的开发
3. 服务拆分粒度更细,有利于资源的重复利用,有利于提高开发效率
4. 可以更精准的制定优化服务方案,提高系统的可维护性
3.2 缺点:
1. 部署较麻烦,给运维工程师带来一定的麻烦
2. 针对数据的管理比较麻烦
3. 系统集成测试比较麻烦
4. Spring Cloud 和Dubbo对比
Dubbo只是实现了服务治理,而SpringCloud 实现了微服务架构的方方面面,服务治理只是其中的一个方面。
最大的区别是: Dubbo底层是使用Netty这样的NIO框架,是基于TCP协议传输的,配合Hession序列化完成的RPC通信。而Spring Cloud 是基于HTTP协议+Rest接口调用远程过程的通信,相对来说,HTTP请求会有更大的报文,占的宽带也会更多。但是REST相比RPC更为灵活。
Dubbo | SpringCloud | |
---|---|---|
服务注册中心 | Zookeeper | Spring Cloud Netfix Eureka |
服务调用方式 | RPC | REST API |
服务监控 | Dubbo-monitor | Spring Boot Admin |
熔断器 | 不完善 | Spring Cloud Netflix Hystrix |
服务网关 | 无 | Spring Cloud Netflix Zuul |
分布式配置 | 无 | Spring Cloud Config |
服务跟踪 | 无 | Spring Cloud Sleuth |
数据流 | 无 | Spring Cloud Stream |
批量任务 | 无 | Spring Cloud Task |
信息总线 | 无 | Spring Cloud Bus |
5. SpringCloud 常用模块
服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
6 服务发现——Netflix Eureka
注册中心是服务发现的核心,它保存了各个可用服务实例的网络网址。服务注册中心必须要有高可用性和实时更新功能。 Netflix Eureka 就是一个服务注册中心。它提供了服务注册和查询信息的REST API。
服务中心又称注册中心,管理各种服务的注册、发现、熔断、负载、降级等。
有了服务中心调用关系会发生变化
有了服务中心任何一个服务都不能直接调用别的服务,要通过服务中心
项目1调用项目2项目2调用项目3
加入服务中心后
当然服务中心这么重要的组件一但挂掉将会影响全部服务,因此需要搭建Eureka集群来保持高可用性,生产中建议最少两台。
随着系统的流量不断增加,需要根据情况来扩展某个服务,Eureka内部已经提供均衡负载的功能,只需要增加相应的服务端实例既可。
那么在系统的运行期间某个实例挂了怎么办?Eureka内容有一个心跳检测机制,如果某个实例在规定的时间内没有进行通讯则会自动被剔除掉,避免了某个实例挂掉而影响服务。
因此使用了Eureka就自动具有了注册中心、负载均衡、故障转移的功能。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
6.2 Eureka搭建
1. 在父模块的pom文件中定义springCloud的版本
<!--Spring Cloud-->
5
<dependency>
6
<groupId>org.springframework.cloud</groupId>
7
<artifactId>spring-cloud-dependencies</artifactId>
8
<version>Finchley.SR2</version>
9
<type>pom</type>
10
<scope>import</scope>
11
</dependency>
12
2.创建Eureka服务器模块commonservice-eureka
3. 配置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.forezp</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.forezp</groupId>
<artifactId>sc-f-chapter1</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
4.配置application.properties
#服务端口
server.port=8220
# 服务名
spring.application.name=ketai-eureka
# 环境设置:dev、test、prod
spring.profiles.active=dev
# 服务地址
eureka.instance.hostname=localhost
#Eureka客户端与Eureka服务端进行通信的地址
eureka.client.serviceUrl.defaultZone= http://${eureka.instance.hostname}:${server.port}/eureka/
#是否将自己注册到Eureka服务器中,本身是服务器,无需注册
eureka.client.registerWithEureka=false
# 是否需要拉取服务信息
eureka.client.fetchRegistry=false
# 设置日志级别
logging.level.root=WARN
5 创建启动类
在启动类上加上注解**@EnableEurekaServer**
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class);
}
}
6启动注册中心并在浏览器访问
System Status:系统信息
DS Replicas:服务器副本
Instances currently registered with Eureka:已注册的微服务列表
General Info:一般信息
Instance Info:实例信息
6.3 服务注册
1. 创建maven模块
2. 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.forezp</groupId>
<artifactId>service-hi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>service-hi</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.forezp</groupId>
<artifactId>sc-f-chapter1</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.、添加服务配置信息
配置application.properties,在客户端微服务中添加注册Eureka服务的配置信息
#指定注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8220/eureka/
#eureka服务器上获取的是服务器的ip地址,否则是主机名
eureka.instance.prefer-ip-address=true
4、添加Eureka客户端注解
在客户端微服务启动类中添加注解
@EnableEurekaClient
@EnableDiscoveryClient和@EnableEurekaClient:都是能够让注册中心能够发现,扫描到该服务。
@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
从Spring Cloud Edgware开始,@EnableDiscoveryClient 或@EnableEurekaClient 可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。
5、启动客户端微服务
启动注册中心
启动已注册的微服务,可以在Eureka注册列表中看到被注册的微服务