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理论么?这里给大家拓展一下知识面。
指的是在一个分布式系统,Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性),三者不可同时获得。
CAP理论就是说在分布式存储系统中,最多只能实现上面的两点,而由于当前的网络硬件肯定会出现延迟丢包等问题,
所以分区容错性是我们必须实现的,所以我们只能在一致性和可用性之间进行权衡。
常见的服务注册中心:
这里,我就以Eureka为例,作为服务注册与发现的组件。
创建一个Maven父工程,其他Module依赖该父工程。这里博主选择的开发工具是IDEA。现在已经有大部分开发人员,转战IDEA了。Spring Cloud版本选择Finchley.RELEASE。
首先在我们的IDEA中选择File->New->Project,选择Maven项目,输入groupId和artifactId,然后一路Next到底。
接着在pom文件中引入相关的依赖。
父Maven的pom.xml文件:
<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.0modelVersion>
<groupId>com.root.projectgroupId>
<artifactId>springcloud-projectartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>pompackaging>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.1.RELEASEversion>
<relativePath/>
parent>
<modules>
<module>eureka-servermodule>
<module>user-servicemodule>
modules>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
<spring-cloud.version>Finchley.RELEASEspring-cloud.version>
properties>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
注意,这里的打包方式(packaging)类型是pom。
在父工程下,新建Module。右击项目,选择New->Module,选择Spring Initializr。
和创建Maven项目一样,填写我们的groupId和artifactId,注意这里打包方式,选择jar。因为它是一个Spring Boot项目,会以jar的方式运行。
最后,选择我们需要的组件。Cloud Discovery下的Eureka Server,然后一直Next即可。
模块创建完成,同样需要引入相关约束。
eureka-server的pom.xml:
<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.0modelVersion>
<groupId>com.root.projectgroupId>
<artifactId>eureka-serverartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>eureka-servername>
<packaging>jarpackaging>
<description>Demo project for Spring Bootdescription>
<parent>
<groupId>com.root.projectgroupId>
<artifactId>springcloud-projectartifactId>
<version>1.0-SNAPSHOTversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
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)。
Client向Server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。
在父工程下,新建Module。右击项目,选择New->Module,选择Spring Initializr。和创建注册中心一样,就不加图了。然后选择我们需要的组件。因为是Client,所以需要选择Cloud Discovery下的Eureka Discovery,这里需要用到应用开发,所以,还需要加入Web模块。
约束引入之后,同样需要配置pom.xml。
user-service的pom.xml
<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.0modelVersion>
<groupId>com.root.projectgroupId>
<artifactId>user-serviceartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>user-servicename>
<packaging>jarpackaging>
<description>Demo project for Spring Bootdescription>
<parent>
<groupId>com.root.projectgroupId>
<artifactId>springcloud-projectartifactId>
<version>1.0-SNAPSHOTversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
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 ,看客户端返回的结果吧。
文章就要接近尾声了。如有不明白的朋友,可以在下方进行留言。当然,如果博主有什么地方出了错,也欢迎大家指出。
愿你学会在孤独中,与自己交流,听自己说话,从而学会深刻。