一、Spring Cloud 简介
Spring Cloud是Spring旗下的项目之一,Spring最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中。
Spring Cloud也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。其主要涉及的组件包括:
Netflix:
- Eureka:服务注册中心
- Gateway:服务网关
- Ribbon:负载均衡
- Feign:服务调用
- Hystrix:断路器
它运行环境简单,可以在开发人员的电脑上跑。spring cloud是基于springboot的,所以开发中需要对springboot有一定的了解。
二、服务注册中心
我们首先需要用的Spring Cloud Netflix的Eureka,eureka是一个服务注册和发现模块,负责管理、记录服务提供者的信息。服务调用者无需自己寻找服务,而是把自己的需求告诉eureka,然后eureka会把符合你的需求告诉你。
服务提供者与eureka之间通过“心跳”机制进行监控,当某个服务提供方出现问题,eureka会自动把它从服务列表中剔除。
原理图
基本架构
- Eureka:服务注册中心,可以是一个集群,对外暴露自己的地址
- 服务提供者:启动后向Eureka提供自己的信息(地址,提供什么服务)
- 客户端消费者:向Eureka订阅服务,Eureka会将对应的服务的所有服务地址列表发送给消费者,并且定期更新
- 心跳(续约):服务提供者定期通过HTTP方式向Eureka刷新自己的状态
2.1 首先创建一个Maven父工程
这个为父工程,后续的工程都以这个为父。
pom.xml文件如下:
<?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.test</groupId>
<artifactId>springCloudTest</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- springCloud -->
<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>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2 然后创建两个Module子工程
一个Module作为服务注册中心,即Eureka Server,另一个是Eureka Client。
下面以创建Eureka Server为例子,说明创建过程:
右键父工程 → 新建Module → 选择Maven 如下图:
下一步 → 选择父工程
Finish就创建好了,下面填写pom.xml文件内容:
pom.xml如下:
<?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">
<parent>
<artifactId>springCloudTest</artifactId>
<groupId>com.test</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eurekaServer</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- Eureka服务注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
2.3 启动一个服务注册中心
只需要在springBoot的启动类上加上一个注解 @EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer //声明当前应用是Eureka服务
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
eureka是一个高可用组件,它没有后端缓存,每一个实例注册之后都必须向注册中心发送心跳,因此可以在内存中完成。默认情况下eureka server也是一个eureka client,所以必须要指定eureka server为一个server,eureka server的配置文件application.yml:
server:
port: 10086
spring:
application:
name: eureka
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
register-with-eureka: false #自己不注册到注册中心
fetch-registry: false #不拉取服务
register-with-eureka: false
和fetch-registry: false
的默认值都是 true
,需要指定为false
,让自己不注册到注册中心、不拉取服务,这样eureka server就是一个server了。
Eureka server是有界面的,启动工程,打开浏览器访问 http://127.0.0.1:10086
No instances available 没有可用的实例,现在只启动了eureka server,当然没有被发现的服务了
三、创建一个服务提供者
当eureka client向eureka server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中剔除。
创建过程与eureka server一样,创建完成后pom.xml文件如下:
<?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">
<parent>
<artifactId>springCloudTest</artifactId>
<groupId>com.test</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service-hi</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
在springBoot的启动类上添加注解 @EnableDiscoveryClient 开启Eureka客户端功能
@SpringBootApplication
@EnableDiscoveryClient //开启eureka客户端发现功能
public class ServiceHiApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceHiApplication.class, args);
}
}
光加上注解是不够的,还需要在服务注册中心注明自己的地址 application.yml:
server:
port: 9091
spring:
application:
name: service-hi
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
注意:
spring.application.name
这个很重要,用来指定应用名称,将来会作为应用id使用。
启动工程,访问Eureka Server监控页面查看
你会发现一个服务已经注册到注册中心了,服务名为spring.application.name
指定的名称SERVICE-HI,端口为9091