微服务、原生云应用
微服务(Microservice)是近两年来非常火的概念,他的含义是:定义好边界的小的独立组件来做好一件事情。微服务是相对于传统单块式架构而言的。
单块式架构是一份代码,部署和伸缩都是基于单个单元进行的,它的优点是易于部署,但是面临着可用性低,可伸缩性差、集中发布的生命周期以及违反单一功能原则。微服务的出现解决了这个问题,它以单个独立的服务来做的一个功能,且要做好这个功能。但使用微服务不可比避免的将功能按照边界拆分为单个服务,体现出分布式的特征,这时每个微服务之间的通信将是我们要解决的问题。
SpringCloud 为我们解决了分布式开发常遇到问题,给出了完整的解决方案。SpringCloud 基于springboot 为我们提供了 配置管理、服务发现、断路器、代理服务等我们在分布式开发时常遇问题的解决方案。
基于SpringCloud开发的程序特别适合在Docker 或者其他专业Pass(平台即服务,如Cloud Foundry)部署,所以又称作原生云应用。
SpringCloud quick start
SpringCloud应用 主要分为以下几个部分
配置服务
SpringCloud 提供了Config Server,它有在分布式系统开发中外部配置的功能。通过Config Server,我们可以集中的存储所有应用的配置文件。
Config Server支持在git 或者文件系统中放置文
件。
springCLoud 提供了注解@EnabelConfigServer来启动配置服务
服务发现
springCloud 通过Netfix OSS 的Eureka 来实现服务发现,服务发现的主要目的是为了让每个服务之间可以相互通信,Eureka Server 为微服务注册中心。
SpringCloud 使用注解的方式提供了 Eureka 服务端(@EnableEurekaServer) 和客户端(@EnableEurekaClient)。
路由网关
路由网关的主要目的是为了让所有的微服务对外只有一个接口,我们只是需要访问一个网关地址,即可由网关将我们的请求代理到不同的服务中。
SpringCloud 是通过Zuul来实现的,支持自动路由映射到在Eureka Server 上注册的服务。SpringCloud 提供了注解@EnableZuulProxy 来启用路由代理。
负载均衡
SpringCLoud提供了Ribbon和Feign 作为客户端的负载均衡。在SpringCloud 下,使用Ribbon 直接注入一个RestTemplate对象即可,此Restemplate 已做好负载均衡的配置;而使用Feign只需定义个注解,有@FeignClien他注解的接口,然后使用@RequestMapping 注解在方法上映射远程REST服务。此方法也是做好负载均衡配置的。
断路器 Circuit Breaker
断路器(Circuit Breaker) 主要是为了解决当某个方法调用失败的时候,调用后备方法来替代失败的方法,以达到容错,阻止级联错误等功能。
SpringCloud使用@EnableCircuitBreaker;来启用断路器支持,使用@HystrixCommand的fallbackMethod 来指定后备方法。
spring Cloud 还给我们提供了一个控制台来监控断路器运行情况。通过@EnabelHystrixDashboard注解开启。
实战
实战主要分为6个微服务组成:
- config:配置服务器,本例中为person-service和some-service提供外部配置。
- discovery:EurekaServer为微服务提供注册。
- person:为UI 模块提供保存person的REST服务。
- some:为UI模块返回一段字符串。
- UI:作为应用网关,提供外部访问的唯一入口,使用* Feign消费person服务、Ribbon消费some服务、且都提供断路器功能;
- monitor:监控UI模块中的断路器
本例只有部分核心代码,完整代码请见文章末尾Git 地址
项目构建
新建模块化的mavne 项目 springCloud 其父模块的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.abel</groupId>
<artifactId>springCloud</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>config</module>
<module>discovery</module>
<module>ui</module>
<module>person</module>
<module>some</module>
<module>monitor</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<!-- 替换 spring-boot-starter-parent 为 cloud-->
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Angel.SR3</version>
<relativePath/>
</parent>
<!--公共依赖-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.2.9</version>
<configuration>
<skipDockerBuild>true</skipDockerBuild>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
服务发现 Discovery Server
未完待续。。。。