1、微服务模式
微服务模式 |
---|
核心微服务开发模式 |
微服务路由模式 |
微服务客户端弹性模式 |
微服务安全模式 |
微服务日志记录和跟踪模式 |
微服务构建和部署模式 |
①
核心微服务开发模式 |
---|
服务粒度 |
通信协议 |
接口设计 |
服务的配置管理 |
服务之间的事件处理 |
②
微服务路由模式 |
---|
服务发现 |
服务路由 |
③
微服务客户端弹性模式 |
---|
客户端负载均衡 |
断路器模式 |
后备模式 |
舱壁模式 |
④
微服务安全模式 |
---|
验证 |
授权 |
凭据管理和传播 |
⑤
微服务日志记录和跟踪模式 |
---|
日志关联 |
日志聚合 |
微服务跟踪 |
⑥
微服务构建和部署模式 |
---|
构建和部署管道 |
基础设施即代码 |
不可变服务器 |
凤凰服务器 |
2、使用Spring Cloud构建微服务
1)SpringBoot
Spring Boot 通过简化构建基于 REST 的微服务的核心任务
2)Spring Cloud Config
Spring Cloud Config 通过集中式服务来处理应用程序配置数据的管理,因此应用程序配置数据(特别是环境特定的配置数据)与部署的微服务完全分离。确保了无论启动多少个微服务实例,这些微服务实例始终具有相同的配置。
可以集成:
Git-Git 个开惊版本控制系统
Consul-Consu 种开源的服务发现工具
Eureka-Eureka 个开源的 Netflix 项目
3)Spring Cloud 服务发现
可以从客户端消费的服务中抽象出部署服务器的物理位置( IP 或服务器名称) 。
4)Spring Cloud与 Netflix Hystrix和 Netflix Ribbon
使用 Netflix Hystrix 库,可以快速实现服务客户端弹性模式,如断路器模式和舱壁模式。
5)Spring Cloud与Netflix Zuul
Spring Cloud 使用 Netflix Zuul 项目为微服务应用程序提供服务路由功能 。
6) Spring Cloud Stream
是一种可让将轻量级消息处理集成到微服务中的支持技术,将微服务与消息代理进行整合,如 RabbitMQ Kafka。
7)Spring Cloud Sleuth
允许将唯一跟踪标识符集成到应用程序所使用的 HTTP 调用和消息通道(RabbitMQ Apache Kafka )之中。
可以结合日志聚合技术工具(如 Papetrail )和跟踪工具(如Zipkin )
8)Spring Cloud Security
是一个验证和授权框架,可以控制哪些人可以访问服务,以及他们可以用服务做什么 。
9)代码供应
Travis CI和 Docker 这两样工具,前者可以作为构建工具,而后者可以构建包含微服务的服务器镜像。
3、Spring Cloud示例
package demo;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
@SpringBootApplication
@RestController
@RequestMapping(value=” hello”)
@EnableCircuitBreaker // 使服务能够使用Hystrix和Ribbon库
@EnableEurekaClient // 告诉服务,它应该使用 Eureka服务发现代理注册自身,并且服务调用是使用服务发现来“查找”远程服务的位置的
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application .class, args);
}
@HystrixCommand(threadPoolKey = "helloThreadPool") // 包装器使用 Hystrix 断路器调用helloRemoteServiceCall方法
public String helloRemoteServiceCall(String firstName, String lastName) {
ResponseEntity<String> restExchange = restTemplate.exchange(
// 使用 一个装饰好的 RestTemplate类来获取一个“逻辑”服务 ID,Eureka 在幕后查找服务的物理位置。
"http://logical-service-id/name/{firstName)/{lastName}", HttpMethod.GET, null, String.class, firstName, lastName);
return restExchange.getBody();
}
@RequestMapping(value="/{firstName)/{lastName)", method = RequestMethod.GET)
public String hello(@PathVariable("firstName") String firstName, @PathVariableable ("lastName") String lastName) {
return helloRemoteServiceCall(firstName , lastName);
}
}
@EnableCircuitBreaker
和@EnableEurekaClient
注解。
@EnableCircuitBreaker注解告 Spring 微服务,将要在应用程序使用 Netflix Hystrix库。
@EnableEurekaClient 注解告诉微服务使用 Eureka 服务发现代理去注册它自己,并将要在代码中使用服务发现去查询远程 REST 服务端点。(服务器地址和端口号是在配置文件中配置。)
@HystrixCommand
注解:
1、在任何时候调用 helloRemoteServiceCall该方法都不会被直接调用,这个调用会被委派给由 Hystrix 管理的线程池。
如果调用时间太长(默认为 1s ), Hystrix 将介入并中断调用这是断路器模式的实现。
2、创建一个由 Hystrix 管理的名为 helloThreadPool 的线程池。 所有对 helloRemoteServiceCall,方法的调用只会发生在此线程池中,
并且将与正在进行的任何其他远程服务调用隔离。
RestTernplate 类将与 Eureka 服务进行通信,并查找一个或多个“name”服务实例的实际位置。作为服务的消费者,不需要知道服务的位置。