Spring Cloud通过在原有的Boot基础上构建,用于快速构建分布式系统的通用模式的工具集。
1. 简介
Spring Cloud为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。
1.1 介绍
微服务是可以独立部署、水平扩展、独立访问(或者有独立的数据库)的服务单元,spring cloud就是这些微服务的大管家,采用了微服务这种架构之后,项目的数量会非常多。
1.2 特点
a) 约定优于配置;
b) 适用于各种环境。无论开发、部署在PC Server或者各种云环境均可。
c) 隐藏了组件的复杂性,并提供声明式、无XML的配置方式。
d) 轻量级的组件。Spring Cloud整合的组件大多比较轻量。比如:Eureka、Zuul等都是各自领域的轻量级实现。
e) 组件丰富,功能齐全。它为微服务架构提供了非常完美的支持,例如:配置、服务发现、网关等等。
f) 选择丰富。比如:它支持使用Eureka、Zookeeper或Consul实现服务发现。
g) 灵活,它的组成部分是解耦的,开发人员按照需求灵活挑选技术选型。
h) 缺点:小型独立的项目不太适合。
i) 遵循CAP理论。其中C代表数据一致性,A代表服务可用性,P代表服务对网络分区故障的容错性。
1.3 常用组件
在搭建微服务架构时,常用的基本组件包含以下几种:
-
服务发现——Netflix Eureka
-
客服端负载均衡——Netflix Ribbon
-
断路器——Netflix Hystrix
-
服务网关——Netflix Zuul
-
分布式配置——Spring Cloud Config
2.服务注册中心
Spring cloud的服务注册及发现,不仅仅只有eureka,还支持Zookeeper和Consul。默认情况下是eureka,spring 封装了eureka,使其非常简单易用,只需要比传统应用增加一行代码就可以使用了,这一行代码就是一个注解。
2.1 创建Eureka
- 创建一个SpringBoot工程,具体创建方法可以参考前边的讲解,然后需要添加对应的依赖,主要添加Eureka的相关依赖信息:
<!--添加cloud注册中心依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
-
然后进行maven clean,下载对应的依赖,或者使用idea的maven自动导入功能:
1556352452044 -
如果重新加载不能够成功下载相关依赖,可以手动使用命令来加载依赖,具体操作如下:
①:在控制台部分,找到terminal命令行:
1556352515395②:输入命令:mvn compile ,使其项目重新进行编译,下载依赖:
1556352550242 -
加载完相关依赖后,为了防止Eureka客户端自注册,造成服务端口被占用的情况,需要在配置中禁用自注册的行为,在application.properties文件中添加:
eureka.client.register-with-eureka=false eureka.client.fetch-registry=false
-
启动SpringCloud项目,启动成功访问Eureka,在这里需要注意几点:
①:如果没有在配置文件中指定访问Eureka端口,那么就使用默认端口8080;
②:如果指定端口,那么需要使用此端口去访问,否则会访问不成功。访问路径:http://localhost:port 比如:http://localhost:8080/
否则会报出如下错误:
1556352764930
6.进入Eureka主界面可以看到,第一次启动Eureka时,并没有任何服务注册:
1556352804153通过此图说明,已经成功启动Eureka。
2.2 创建Discovery
当服务注册中心搭建完成之后,我们也需要创建一个提供服务的客户端,并在Eureka中注册。
-
首先,创建一个基本的Spring Boot应用,在pom.xml中,创建一个基本的Cloud项目,加入如下配置:
<dependencies> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!--添加cloud注册中心依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies> <!--添加cloud依赖版本--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR6</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
注:在添加Cloud的依赖版本时,需要注意根据SpringBoot的版本不同,有所改变去选择Cloud的版本信息。
-
创建对应的处理业务逻辑的类,即Controller:(实现/add请求处理接口,通过DiscoveryClient对象,在日志中打印出服务实例的相关内容)
@RestController public class DiscoveryController { private final Logger logger = LoggerFactory.getLogger(DiscoveryController.class); @Autowired private DiscoveryClient discoveryClient; @RequestMapping(value = "/add" ,method = RequestMethod.GET) public Integer getNumber(@RequestParam Integer a, @RequestParam Integer b){ ServiceInstance serviceInstance = discoveryClient.getLocalServiceInstance(); Integer i = a + b; logger.info("host:"+serviceInstance.getHost()+" ,service_id:"+serviceInstance.getServiceId()+",result:"+i); return i; } }
-
在对应的核心类中添加客户端注解标示,在主类中通过加上@EnableDiscoveryClient注解,该注解能激活Eureka中的DiscoveryClient实现,才能实现Controller中对服务信息的输出:
1556353298244 -
完成相关的代码编写之后,还需要在application.properties做一些配置工作:
#指定提供方端口 server.port = 8024 #指定微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问 spring.application.name = discovery-service #对应服务注册中心的配置内容,指定服务注册中心的位置 eureka.client.serviceUrl.defaultZone=http://localhost:8023/eureka/
其中defaultZone是指定eureka服务器的地址,无论是注册还是发现服务都需要这个地址。application.name是指定进行服务注册时该服务的名称。这个名称就是后面调用服务时的服务标识符。
注:在这里设置客户端新的端口,是为了在本机上测试区分服务提供方和服务注册中心,使用server.port属性设置不同的端口。
-
启动服务注册中心,然后再启动客户端服务,访问服务注册中心的地址:http://localhost:8023 然后就可以看到有新的服务被注册进来:
1556353409651注:在使用服务注册中心时,需要先启动Eureka服务,否则直接启用Discovery服务,会报错:
1556353423839
2.3 常见问题
问题1: 加载依赖时,执行mvn clean 报错
1556353546759解决:由于使用的版本不兼容造成的,使其在进行重新进行下载jar包时,造成冲突以及下载不成功,可以根据SpringBoot和SpringCloud的版本来进行调整。(具体可查看问题4)
问题2:如果新建一个SpringBoot项目,进行服务注册中心启动时,发现启动报错
1556353585645解决:在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为。
禁止方式如下:
如果不进行禁用,则会报出上面的错误,因为当注册中心将自己作为客户端注册的时候,发现在server上的端口被自己占据了,然后就挂了。
1556353630929第一个参数:注册中心的port,默认port=8080,防止端口被占用;
第二、三个参数:防止Eureka将自己作为客户端去注册,因此在这里禁用,否则无法正常启动。
第四个参数:声明访问Eureka的地址,当启动后,可以按照指定的URL去访问
网友评论