微雨初晴 - 微服务
type: channel
link: http://alanzh.com/category/微服务/
description: 微服务
items: 在SpringCloud 中如何防止绕过网关请求后端服务
items: [DigitalAssert] 项目部署发布
items: Spring Cloud系列-微服务篇(六) 服务消费者 Feign
items: Spring Cloud系列-常见问题总结篇
items: Spring Cloud系列-微服务篇(五) 服务消费者 Ribbon
items: Spring Cloud系列-微服务篇(四) Eureka高可用集群 (2)
items: Spring Cloud系列-微服务篇(三) Eureka高可用集群 (1)
items: Spring Cloud系列-微服务篇(二) 服务注册和服务发现
items: Spring Cloud系列-微服务篇(一) 服务注册和服务发现
items: Spring Cloud系列-微服务篇(开篇) SpringCloud组件和概念介绍

在SpringCloud 中如何防止绕过网关请求后端服务
type: item
date: 2023-09-07T18:35:57+00:00
description: 使用SpringCloud架构中在不作任何处理的情况下我们是可以绕过网关直接访问后端服务的。因此会带来很大的安全隐患.解决方案1.网络隔离将后端普通服务都部署在内网，通过防火墙策略限制只允许网关应用访问后端服务。2.应用层拦截请求后端服务时通过拦截器校验请求是否来自网关和服务间的调用，如果是非法调用则提示不允许访问。在请求经过网关的时候给请求头中增加一个额外的Header表示请求来源，在后端服务中写一个拦截器，判断请求头是否是来自网关或者是内部服务调用，如果不一致则不允许访问并给出提示。当然为了防止在每个后端服务都需要编写这个拦截器，我们可以将其写在一个公共的starter中，让后端服务引用即可。而且为了灵活，可以通过配置决定是否只允许后端服务访问。2.1 在网关gateway模块编写网关过滤器package cn.myxl.gateway.filter; import cn.myxl.gateway.constant.SecurityConstants; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpRequest.Builder; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; /** * @author alan.yang.zhang * @date 2023-09-07 22:48 */ @Component @Slf4j public class RequestSourceFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest.Builder mutate = exchange.getRequest().mutate(); handleAddHeader(mutate, SecurityConstants.SOURCE, SecurityConstants.SOURCE_GATEWAY); ServerWebExchange webExchange = exchange.mutate().request(mutate.build()).build(); return chain.filter(webExchange); } private void handleAddHeader(Builder mutate, String headerName, String headerValue) { mutate.header(headerName, headerValue); } private void handleRemoveHeader(Builder mutate, String headerKey) { mutate.headers(httpHeaders -> httpHeaders.remove(headerKey)).build(); } @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE + 100; }2.1 创建Starter模块service-security-spring-boot-starter 创建annotation SecurityCheck 用来标记需要检查的方法 package cn.myxl.cloud.security.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java…

[DigitalAssert] 项目部署发布
type: item
date: 2019-01-29T09:15:32+00:00
description: 项目结构: 前后分离部署方案很多，本次采用的是使用NGINX发布静态文件，并代理后端服务解决跨域问题。 前端：vue + element-ui 后端：SpringBoot 第一步: 后端部署 项目打包 mvn clean package 项目开启服务 java -jar digital-markting-customized-business-webapp-scrm-1.0.0.jar 第二步: 前端部署 vue项目打包 npm run build 拷贝dist下生成文件static和index.html到Nginx指定发布的目录（默认html目录下） 第三步: 配置Nginx server { listen 8080; server_name localhost; location / { root html; index index.html index.htm; } #代理后端API; #后端服务的地址为: http://localhost:8098/api/XXXX, 所以我们代理的地址为 /api location /api/ { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 后端服务地址 proxy_pass http://localhost:8098/api/; } #后面配置省略， 默认就好 } 第四步: 重启Nginx服务 重启nginx nginx -s reload 齐活。

Spring Cloud系列-微服务篇(六) 服务消费者 Feign
type: item
date: 2017-07-04T05:15:31+00:00
description: 1.准备 在spring Cloud Netflix栈中，各个微服务都是以HTTP接口的形式暴露自身服务的，因此在调用远程服务时就必须使用HTTP客户端。我们可以使用JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client, Spring的RestTemplate。但是，用起来最方便、最优雅的还是要属Feign了。 Feign是一个声明式的Web Service客户端，它使得编写Web Serivce客户端变得更加简单。我们只需要使用Feign来创建一个接口并用注解来配置它既可完成。它具备可插拔的注解支持，包括Feign注解和JAX-RS注解。 Feign也支持可插拔的编码器和解码器。Spring Cloud为Feign增加了对Spring MVC注解的支持，还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。 2.使用Feign实现客户端负载均衡的消费者 1.通过 http://start.spring.io/ 使用SPRING INITIALIZR 创建一个基础的Spring Boot工程， Dependencies :Eureka Discovery + Feign Group : com.alanzh.platform Artifact : wish.feign.server Spring boot 版本: 1.5.4 <?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.alanzh.platform</groupId> <artifactId>wish.feign.server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>wish.feign.server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath/> </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.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencie…

Spring Cloud系列-常见问题总结篇
type: item
date: 2017-07-04T03:05:00+00:00
description: 1. @SpringBootApplication注解的程序入口类必须放在所有的RestController的根路径的package下,否则无法被注册到Spring Boot的RestController上去 如果遇见这样得错误There was an unexpected error (type=Not Found, status=404).但是检查请求没有写错,那么请检查一下@SpringBootApplication是否在含有RestController类的根路径package下. package com.alanzh.platform.user.action; @RestController public class UserFeignAction { } package com.alanzh.platform; @SpringBootApplication public class Application { }

Spring Cloud系列-微服务篇(五) 服务消费者 Ribbon
type: item
date: 2017-07-03T08:35:59+00:00
description: 1.准备 Ribbon是一个基于HTTP和TCP客户端的负载均衡器,可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用. 当Ribbon与Eureka联合使用时，ribbonServerList会被DiscoveryEnabledNIWSServerList重写，扩展成从Eureka注册中心中获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing，它将职责委托给Eureka来确定服务端是否已经启动。 下面我们通过实例看看如何使用Ribbon来调用服务，并实现客户端的均衡负载。 启动服务注册中心：wish.eureka.server(端口设置为1000) 启动服务提供方：wish.user.service(端口设置为2000) 启动服务提供方：wish.user.service(端口设置为2001) 可以使用命令 java -jar wish.user.service-0.0.1-SNAPSHOT.jar --server.port=2001 启动服务并指定端口 此时访问：http://localhost:1000/ 2.使用Ribbon实现客户端负载均衡的消费者 1.通过 http://start.spring.io/ 使用SPRING INITIALIZR 创建一个基础的Spring Boot工程， Dependencies :Eureka Discovery + Ribbon Group : com.alanzh.platform Artifact : wish.ribbon.server Spring boot 版本: 1.5.4 <?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.alanzh.platform</groupId> <artifactId>wish.ribbon.server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>wish.ribbon.server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath/> </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.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-start…

Spring Cloud系列-微服务篇(四) Eureka高可用集群 (2)
type: item
date: 2017-07-03T05:38:00+00:00
description: 之前我们使用的Eureka是标准模式只有单个节点现在我们使用peer模式构建Eureka集群 更新application 配置 更新第一章我们的Eureka-Server项目 application.properites 为 application.yml (语法更为简洁) # Portal Info info: app: name: "@project.name@" description: "@project.description@" version: "@project.version@" # Spring Info spring: application: name: "@project.name@" server: port: 1000 eureka: server: enable-self-preservation: false # 关闭自我保护模式（缺省为打开） eviction-interval-timer-in-ms: 5000 # 续期时间，即扫描失效服务的间隔时间（缺省为60*1000ms） client: fetch-registry: false register-with-eureka: false serviceUrl: defaultZone: http://admin:123123@localhost:1000/eureka/ 拷贝application.yml 为3份 分别命名为 application-eureka-server-0.yml, application-eureka-server-1.yml, application-eureka-server-2.yml 注: 我们要构筑3个peer eureka server,所以拷贝3份. application-eureka-server-0.yml # Spring Info server: port: 1000 eureka: instance: hostname: eureka-server-0 server: enable-self-preservation: false # 关闭自我保护模式（缺省为打开） eviction-interval-timer-in-ms: 5000 # 续期时间，即扫描失效服务的间隔时间（缺省为60*1000ms） client: register-with-eureka: true fetch-registry: true serviceUrl: defaultZone: http://admin:123123@eureka-server-1:1001/eureka/,http://admin:123123@eureka-server-2:1002/eureka/ 我们将app info等相同的信息保留在application.yml. 显示开启register-with-eureka: true 和 fetch-registry: true 否则会被application.yml 中信息覆盖. defaultZone: http://admin:123123@eureka-server-1:1001/eureka/,http://admin:123123@eureka-server-2:1002/eureka/, 在defaultZone 处分别填写集群中除了自己的其他节点. application-eureka-server-1.yml # Spring Info server: port: 1001 eureka: instance: hostname: eureka-server-1 server: enable-self-preservation: false # 关闭自我保护模式（缺省为打开） eviction-interval-timer-in-ms: 5000 # 续期时间，即扫描失效服务的间隔时间（缺省为60*1000ms） client: register-with-eureka: true fetch-registry: true serviceUrl: defaultZone: http://admin:123123@eureka-server-0:1000/eureka/,http://admin:123123@eureka-server-2:1002/eureka/ application-eureka-server-2.yml # Spring Info server: port: 1002 eureka: instance: hostname: eureka-server-2 server: enable-self-preservation: false # 关…

Spring Cloud系列-微服务篇(三) Eureka高可用集群 (1)
type: item
date: 2017-05-14T08:04:00+00:00
description: 一. CAP理论概述 分布式领域中存在CAP理论，且该理论已被证明：任何分布式系统只可同时满足两点，无法三者兼顾。 C：Consistency，一致性，数据一致更新，所有数据变动都是同步的。 A：Availability，可用性，系统具有好的响应性能。 P：Partition tolerance，分区容错性。 因此，将精力浪费在思考如何设计能满足三者的完美系统上是愚钝的，应该根据应用场景进行适当取舍。 （1）一致性 一致性是指从系统外部读取系统内部的数据时，在一定约束条件下相同，即数据变动在系统内部各节点应该是同步的。根据一致性的强弱程度不同，可以将一致性级别分为如下几种： 强一致性（strong consistency）。任何时刻，任何用户都能读取到最近一次成功更新的数据。 单调一致性（monotonic consistency）。任何时刻，任何用户一旦读到某个数据在某次更新后的值，那么就不会再读到比这个值更旧的值。也就是说，可获取的数据顺序必是单调递增的。 会话一致性（session consistency）。任何用户在某次会话中，一旦读到某个数据在某次更新后的值，那么在本次会话中就不会再读到比这值更旧的值 会话一致性是在单调一致性的基础上进一步放松约束，只保证单个用户单个会话内的单调性，在不同用户或同一用户不同会话间则没有保障。示例case：php的session概念。 最终一致性（eventual consistency）。用户只能读到某次更新后的值，但系统保证数据将最终达到完全一致的状态，只是所需时间不能保障。 弱一致性（weak consistency）。用户无法在确定时间内读到最新更新的值。 二.ZooKeeper提供的一致性服务 很多文章和博客里提到，zookeeper是一种提供强一致性的服务，在分区容错性和可用性上做了一定折中，这和CAP理论是吻合的。但实际上zookeeper提供的只是单调一致性。 原因： 假设有2n+1个server，在同步流程中，leader向follower同步数据，当同步完成的follower数量大于 n+1时同步流程结束，系统可接受client的连接请求。如果client连接的并非同步完成的follower，那么得到的并非最新数据，但可以保证单调性。 follower接收写请求后，转发给leader处理；leader完成两阶段提交的机制。向所有server发起提案，当提案获得超过半数（n+1）的server认同后，将对整个集群进行同步，超过半数（n+1）的server同步完成后，该写请求完成。如果client连接的并非同步完成follower，那么得到的并非最新数据，但可以保证单调性。 用分布式系统的CAP原则来分析Zookeeper： C: Zookeeper保证了最终一致性,在十几秒可以Sync到各个节点. A: Zookeeper保证了可用性,数据总是可用的,没有锁.并且有一大半的节点所拥有的数据是最新的,实时的. 如果想保证取得是数据一定是最新的,需要手工调用Sync() P: 有2点需要分析的. 节点多了会导致写数据延时非常大,因为需要多个节点同步. 节点多了Leader选举非常耗时, 就会放大网络的问题. 可以通过引入 observer节点缓解这个问题. 问题: CAP满足哪几部分 | failover方式是怎样 | 语言机制 DNS <DNS 变更延迟问题> DNS最原始的配置文件和 DNS 来做服务发现，Host、端口都是写在配置文件里的，发生变更的时候只能修改配置文件并重启服务。所以当某台机器挂掉的时候，依赖它上面服务的其他系统也都全部会出问题。而应急的步骤都是先在别的机器上运行新的实例，修改配置文件并重启关联的其他系统。这样做费时、费力、且会有一个时间窗口内系统无法提供服务。 NGINX <中心化负载均衡，单点问题> 通过 Nginx 来做了负载均衡/主备的这样做还是有两个问题：（1）Nginx 本身成为一个故障点（2）连接数量翻倍，其中第二个问题曾导致我们的环境出现了 nf_conntrack table full 的问题。我们的关键服务都是多实例负载均衡的，当系统并发上升到一定程度的时候，某些服务器，尤其是跑着 Nginx 的机器很容易出现这个错误。 zookeeper <多语言问题> zk服务实例注册的 Node 类型是 ephemeral node，这种类型的节点只有在客户端保持着连接的时候才有效。所以当某个服务实例被停止或者出现网络异常的时候，对应的节点也会被删掉。因此，任何时候从 ZooKeeper 里查询到的都是当前活跃的实例。借助 ZooKeeper 的推送功能，服务的消费者可以得知实例的变化，从而可以从容应对服务实例的宕机和新实例的添加，无需重…

Spring Cloud系列-微服务篇(二) 服务注册和服务发现
type: item
date: 2017-05-14T07:52:00+00:00
description: 一：创建“服务提供方” 在这里使用Spring Boot快速的创建三个基础服务，并且其中三者之间存在逻辑依赖关系。 User Service Wish Service Tree Service 现在我们以User Service 为例通过 http://start.spring.io/ 使用SPRING INITIALIZR 创建一个基础的Spring Boot工程， Dependencies :Eureka Discovery Group : com.alanzh.portal Artifact : wish.user.server Spring boot 版本: 1.5.3 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.alanzh.platform</groupId> <artifactId>wish.user.service</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>wish.user.service</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> <relativePath/> </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.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</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> User Entry 领域实体 packa…

Spring Cloud系列-微服务篇(一) 服务注册和服务发现
type: item
date: 2017-05-11T07:19:00+00:00
description: 在简单介绍了Spring Cloud和微服务架构之后，下面回归本文的主旨内容，如何使用Spring Cloud搭建服务注册与发现模块。 一：Eureka简介 Eureka是Spring Cloud Netflix的一个子模块，也是核心模块之一。用于云端服务发现，一个基于REST的服务，用于定位服务，以实现云端中间层服务发现和故障转移。 服务注册与发现对于微服务系统来说非常重要。有了服务发现与注册，你就不需要整天改服务调用的配置文件了，你只需要使用服务的标识符，就可以访问到服务。他的功能类似于dubbo的注册中心（register）。 服务发现： 服务发现是微服务基础架构的关键原则之一。试图着手配置每个客户端或某种格式的约定可以说是非常困难的和非常脆弱的。Eureka是Netflix服务发现的一种服务和客户端。这种服务是可以被高可用性配置的和部署,并且在注册的服务当中，每个服务的状态可以互相复制给彼此。 服务注册: 当一个客户端注册到Eureka,它提供关于自己的元数据（诸如主机和端口，健康指标URL，首页等）Eureka通过一个服务从各个实例接收心跳信息。如果心跳接收失败超过配置的时间，实例将会正常从注册里面移除 所以，我们这里的核心内容就是服务发现模块：Eureka。下面我们动手来做一些尝试。 二：创建“服务注册中心” 1.通过 http://start.spring.io/ 使用SPRING INITIALIZR 创建一个基础的Spring Boot工程， Dependencies :Eureka Server Group : com.alanzh.portal Artifact : ms-eureka-server Spring boot 版本: 1.5.3 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.alanzh.platform</groupId> <artifactId>wish.eureka.server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>wish.eureka.server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> <relativePath/> </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.RELEASE</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> <depe…

Spring Cloud系列-微服务篇(开篇) SpringCloud组件和概念介绍
type: item
date: 2017-05-11T05:40:00+00:00
description: 一: 什么是微服务（Microservice） “微服务架构”在这几年非常的火热，以至于关于微服务架构相关的产品社区也变得越来越活跃（比如：netflix、dubbo），Spring Cloud也因Spring社区的强大知名度和影响力也被广大架构师与开发者备受关注。 那么什么是“微服务架构”呢？简单的说，微服务架构就是将一个完整的应用从数据存储开始垂直拆分成多个不同的服务，每个服务都能独立部署、独立维护、独立扩展，服务与服务间通过诸如RESTful API的方式互相调用。 对于“微服务架构”，大家在互联网可以搜索到很多相关的介绍和研究文章来进行学习和了解。也可以阅读始祖Martin Fowler的《Microservices》，本文不做更多的介绍和描述。 我们把整个系统根据业务拆分成几个子系统。 1. 服务注册和发现 : 所有的服务都在注册中心注册，负载均衡也是通过在注册中心注册的服务来使用一定策略来实现。 2. 服务路由 : 所有的客户端都通过同一个网关地址访问后台的服务，通过路由配置，网关来判断一个URL请求由哪个服务处理。请求转发到服务上的时候也使用负载均衡。 3. 服务负载均衡 : 每个子系统可以部署多个应用，多个应用之间使用负载均衡。 4. 断路器:及时处理服务调用时的超时和错误，防止由于其中一个服务的问题而导致整体系统的瘫痪。 5. 服务部署 : 实现自动部署和CI 6. 服务配置管理 :实现统一的配置 7. 服务监控 :监控每个服务调用花费的时间等。 8. 日志处理: 实现统一的日志处理 目前主流的微服务框架：Dubbo、 SpringCloud、thrift、Hessian等。 二：SpringCloud项目简介 springCloud是基于SpringBoot的一整套实现微服务的框架。他提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。最重要的是， 跟spring boot框架一起使用的话，会让你开发微服务架构的云服务非常好的方便。 SpringBoot旨在简化创建产品级的 Spring 应用和服务，简化了配置文件，使用嵌入式web服务器，含有诸多开箱即用微服务功能 spring cloud子项目包括： Spring Cloud Config： 配置管理开发工具包，可以让你把配置放到远程服务器，目前支持本地存储、Git以及Subversion。 Spring Cloud Bus： 事件、消息总线，用于在集群（例如，配置变化事件）中传播状态变化，可与Spring Cloud Config联合实现热部署。 Spring Cloud Netflix： 针对多种Netflix组件提供的开发工具包，其中包括Eureka、Hystrix、Zuul、Archaius等。 Netflix Eureka： 云端负载均衡，一个基于 REST 的服务，用于定位服务，以实现云端的负载均衡和中间层服务器的故障转移。 Netflix Hystrix： 容错管理工具，旨在通过控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。 Netflix Zuul： 边缘服务工具，是提供动态路由，监控，弹性，安全等的边缘服务。 Netflix Archaius： 配置管理API，包含一系列配置管理API，提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。 Spring Cloud for Cloud Foundry： 通过Oauth2协议绑定服务到CloudFoundry，CloudFoundry是VMware推出的开源PaaS云平台。 Spring Cloud Sleuth： 日志收集工具包，封装了Dapper,Zipkin和HTrace操作。 Spring Cloud Data Flow： 大数据操作工具，通过命令行方式操作数据流。 Spring Cloud Security： 安全工具包，为你的应用程序添加安全控制，主要是指OAuth2。 Spring Cloud Consul： 封装了Consul操作，consul是一个服务发现与配置工具，与Docker容器可以无缝集成。 Spring Cloud Zookeeper： 操作Zookeeper的工具包，用于使用zookeeper方式的服务注册和发现。 Spring Cloud Stream： 数据流操作开发包，封装了与Redis,Rabbit、Kafka等发送接收消息。 Spring Cloud CLI： 基于 Spring Boot CLI，可以让你以命令行方式快速建立云组件。