从上一篇博客《Spring-boot:5分钟整合Dubbo构建分布式服务》 过度到Spring Cloud,我们将开始学习如何使用Spring Cloud 来搭建微服务。继续采用上一篇博客中所使用到的图:
我们先来观察一下Spring Cloud 的组成,从上图中可以发现,Spring Cloud 的服务会比Dubbo 完善太多,Spring Cloud 包括了配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等一系列的服务。在后续,我们会对每一个服务进行深入研究,而在本文中,我们将快速入门Spring Cloud ,一起来看看 与Dubbo 相比,Spring Cloud 有何不同。
一、服务治理
1.1、概括
服务治理,或者我们可以理解为服务注册中心,Spring Cloud 应用中可以支持多种不同的服务治理框架,如:Netflix Eureka、Consul、Zookeeper。
如上图所示,我们在使用 IDEA 进行 Spring Cloud 项目创建的时候,编辑器会提示我们选择默认则服务治理框架。
与Dubbo 相比,Spring-Cloud 提供了更加丰富的选择,而在本次学习博文中,我们将会采用 Eureka 作为服务注册中心进行开发。
Spring Cloud Eureka 是Spring Cloud Netflix 项目下的服务治理模块。而 Spring Cloud Netflix 项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。
1.2、创建“服务注册中心”
项目创建方式,可以参考《Spring-Boot:6分钟掌握SpringBoot开发》 学习如何快速搭建Spring-Boot 项目,这里只做简单的介绍:
1.3、Pom.xml
与Dubbo 不一样,Dubbo 采用Zookeeper 作为服务注册中心,因此只需要开发 Productor 和Consumer 即可,而Spring-cloud 中,需要我们独自开发一个服务治理服务(服务注册中心),但是由于Spring-boot 带来的敏捷开发,我们只需要引入:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency>
其他相关依赖,则跟Spring-Boot Web 应用类似,在这里就不细述了。
1.4、Application.properties
在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,只需要在 application.properties 配置文件中增加如下信息:
这里我们将服务的端口号修改为 8761 ,服务名称为 eureka-server
spring.application.name=eureka-server
server.port=8761
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
1.5、Application.java
区别于普通的Spring Boot 项目,我们需要为启动类添加一个 @EnableEurekaServer 注解,用于标识出这个服务是 Eureka 服务:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class SpringBootCloudApplication { public static void main(String[] args) { SpringApplication.run(SpringBootCloudApplication.class, args); } }
1.6、启动项目
运行 Application.java 中的 main 方法,启动 Eureka 服务,然后访问 http://localhost:8761/:
到这里位置,我们的Spring-cloud 服务治理 以及搭建好了,相较于搭建一个Zookeeper 服务,在下认为,还是这个比较方便,毕竟 Spring-cloud-Eureka 也是基于Java 实现,你觉得呢?
二、服务提供者
下面我们创建提供服务的客户端,并向服务注册中心注册自己。本文我们主要介绍服务的注册与发现,所以我们不妨在服务提供方中尝试着提供一个接口来获取当前所有的服务信息。
当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。
项目创建与上述构建方式类似,大家可以参照上述方法,再创建多一个Spring Cloud 项目。
2.1、Pom.xml
Maven 依赖 与上述类似:
<?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.jaycekon</groupId> <artifactId>spring-boot-cloud-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-boot-cloud-provider</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <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>Dalston.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </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>