Spring Cloud简介
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
以上信息来自于百度百科:https://baike.baidu.com/item/spring cloud/20269825?fr=aladdin
简单点说:Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案。
说到分布式,那么大家知道分布式应用知识的的CAP理论么?这里给大家拓展一下知识面。
CAP定理:
指的是在一个分布式系统,Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性),三者不可同时获得。
- 一致性( C ):在分布式系统中的所有数据备份,在同一时刻是否同样的值(所有节点在同一时刻的数据完全一致,越多节点,数据同步越耗时)。
- 可用性( A ):在集群中一部分节点故障过后,集群整体是否还能响应客户端的读写请求(对数据更新具备高可用)。
- 分区容错性( P ):实则高可用性,一个节点发生故障,并不影响其他节点。
CAP理论就是说在分布式存储系统中,最多只能实现上面的两点,而由于当前的网络硬件肯定会出现延迟丢包等问题,
所以分区容错性是我们必须实现的,所以我们只能在一致性和可用性之间进行权衡。
服务的注册与发现
- 服务注册:可以理解为服务提供者(provider),在服务启动时,向注册中心,注册自己的服务。
- 服务发现:可以理解为服务消费者(consumer),就是消费者去注册中心上查询注册了哪些服务,服务有多少个实例,哪些是健康的,哪些是不可用的。
常见的服务注册中心:
- zookeeper
- eureka
- consul
- etcd
这里,我就以Eureka为例,作为服务注册与发现的组件。
项目的搭建
创建父工程
创建一个Maven父工程,其他Module依赖该父工程。这里博主选择的开发工具是IDEA。现在已经有大部分开发人员,转战IDEA了。Spring Cloud版本选择Finchley.RELEASE。
首先在我们的IDEA中选择File->New->Project,选择Maven项目,输入groupId和artifactId,然后一路Next到底。
接着在pom文件中引入相关的依赖。
父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.root.project</groupId>
<artifactId>springcloud-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/>
</parent>
<modules>
<module>eureka-server</module>
<module>user-service</module>
</modules>
<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>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</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>
注意,这里的打包方式(packaging)类型是pom。
创建注册中心(Eureka)
在父工程下,新建Module。右击项目,选择New->Module,选择Spring Initializr。
和创建Maven项目一样,填写我们的groupId和artifactId,注意这里打包方式,选择jar。因为它是一个Spring Boot项目,会以jar的方式运行。
最后,选择我们需要的组件。Cloud Discovery下的Eureka Server,然后一直Next即可。
模块创建完成,同样需要引入相关约束。
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.root.project</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<packaging>jar</packaging>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.root.project</groupId>
<artifactId>springcloud-project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
如需启动注册中心,需要我们进行相关的配置。
1.在启动类中加入@EnableEurekaServer注解,表明这是一个注册中心。
@SpringBootApplication
/**
* @author: 清风一阵吹我心
* 注解表明是eureka注册中心
* */
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
2.在application.yml文件中进行相关配置,有些朋友应该是application.properties,这都是无关紧要的,因为博主习惯使用.yml文件。
#应用名称
spring:
application:
name: eureka-server
#指定端口
server:
port: 8761
eureka:
instance:
hostname: localhost
#声明自己是个服务端,server一定程度上也是client,互为client
client:
#由于自己就是服务器,不需要注册到自己
register-with-eureka: false
#由于自己就是服务器,不需要从服务器获取注册信息
fetch-registry: false
#服务地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#自我保护机制 禁止关闭,默认是true
# server:
# enable-self-preservation: false
注册中心的搭建就完成了,启动浏览器,访问 http://localhost:8761,出现如下界面。
就证明,注册中心,搭建成功了。这是Eureka提供的一个管理服务注册与发现的控制台。可以看到Application下显示 No application available,这是因为,还没有往注册中心注册服务。
接下来,就创建一个用户服务(Eureka Client)。
创建用户服务(Eureka Client)
Client向Server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。
在父工程下,新建Module。右击项目,选择New->Module,选择Spring Initializr。和创建注册中心一样,就不加图了。然后选择我们需要的组件。因为是Client,所以需要选择Cloud Discovery下的Eureka Discovery,这里需要用到应用开发,所以,还需要加入Web模块。
约束引入之后,同样需要配置pom.xml。
user-service的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.root.project</groupId>
<artifactId>user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-service</name>
<packaging>jar</packaging>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.root.project</groupId>
<artifactId>springcloud-project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置完成,再去application.yml进行相关的配置。
#应用名称
spring:
application:
name: user-service
#端口
server:
port: 8800
#指定注册中心
eureka:
client:
service-url:
defaultzone: http://localhost:8761/eureka/
大家注意,spring.application.name这个配置很重要,因为以后服务之间的调用,一般都是根据这个name。
最后再在启动类上加入客户端的注解。
@SpringBootApplication
/**
* @author: 清风一阵吹我心
* @description: @EnableEurekaClient表明这个是一个eurekaclient(ps:默认可以不用加)
*/
@EnableEurekaClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
其他逻辑的实现,基本上就是Spring Boot中的操作,所以,想要入手Spring Cloud,还需要掌握Spring Boot相关知识。下面就写一些伪代码来测试一下。
创建一个用户的实体类:
package com.root.project.userservice.pojo;
import lombok.Data;
import java.io.Serializable;
/**
* @ClassName: User
* @Author: 清风一阵吹我心
* @Description: TODO
* @Date: 2019/1/17 16:26
* @Version 1.0
**/
@Data
public class User implements Serializable {
private String title;
private String author;
public User(){
}
public User(String title,String author){
this.title = title;
this.author = author;
}
//使用lombok自动生成getter、setter
}
在控制层写相应的请求处理:
package com.root.project.userservice.controller;
import com.root.project.userservice.pojo.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName: UserController
* @Author: 清风一阵吹我心
* @Description: TODO
* @Date: 2019/1/17 14:42
* @Version 1.0
**/
@RestController
@RequestMapping("/api/v1.0/")
public class UserController {
@Value("${server.port}")
private String port;
@GetMapping(value = "user")
public String helloMethod() {
User user = new User("Spring Cloud之服务注册与发现", "清风一阵吹我心");
return "这篇文章的标题是:" + user.getTitle() + ",作者是:" + user.getAuthor() + ",端口号是:" + port;
}
}
启动用户服务,看一下Eureka的界面
可以看到箭头的标注处,就是用户服务,显示的正是application.yml中的应用名称,还有相关的端口号:8800。
当然还有人会疑惑,上面还有一段红色的文字,其实这是一个警告,意思是说:服务过于少,而且上线率比较低。这是Eureka的一种自我保护模式,可以关闭这种检查。
ps:自我保护模式禁止关闭,默认是开启状态(true)
接下来,就访问 http://localhost:8800/api/v1.0/user ,看客户端返回的结果吧。
文章就要接近尾声了。如有不明白的朋友,可以在下方进行留言。当然,如果博主有什么地方出了错,也欢迎大家指出。
愿你学会在孤独中,与自己交流,听自己说话,从而学会深刻。