之前写了一篇博文,介绍得太片面,后面觉得文章写得太水了,就重新把书看了一遍,将书上前5章的代码一一实现。这篇文章主要介绍微服务架构,后面会在写一篇介绍docker。
全书将搭建了一个使用Spring Cloud一系列的架构,没有深层次的业务,只有两个简单的方法。涉及到每个技术点都有讲解,读完会对微服务会大致有印象。对Spring Cloud深入了解需要到官网查看文档:https://cloud.spring.io/spring-cloud-static/Greenwich.RELEASE/single/spring-cloud.html。总的来说是一本不涉及较深知识点的工具书,读完后自己实现一个或把源码拿来看还是有所收获的。
项目架构图如:
全书共分为四部分:第一部分“微服务概述”,主要讲解微服务的由来、概念、特点和微服务架构等;第二部分“微服务的开发”,主要讲解微服务开发框架Spring Boot的使用;第三部分“微服务架构的构建”,主要讲解如何使用Spring Cloud的相关组件来构建微服务架构;第四部分“微服务的部署”,主要讲解Docker技术,以及如何在Docker中部署微服务项目。
主要技术点:Spring Cloud Eureka实现服务发现;Spring Cloud Ribbon实现客户端负载均衡;Spring Cloud Hystrix 实现微服务架构中的服务容错保护;Spring Cloud Zuul实现API网关服务;Spring Cloud Config实现分布式配置管理;Docker Swarm 的集群;Jenkins完成微服务的自动化部署;Docker Comopse编排工具
心跳默认30s,3次失败后移除服务
出现警告
因为本地调试触发Eureka Server自我保护机制。注册中心维护的实例不是很准确,本地开发,在配置文件使用eureka.server,enable-self-perservation= false关闭保护机制,确保将不可用实例正确删除。
Eureka启动类,@EnableEurekaServer注解服务端,@EnableEurekaClient注解客户端
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
分布式架构中,客户端的同一个实例在多个应用上使用Ribbon实现。@LoadBalanced 加在 Rest template 上就具有负载均衡。用户服务查询订单服务,订单服务实现了负载均衡(需要多个订单实例)。工作时:1.优先选择同一区域且负载较少的server;2.根据指定策略从server取到服务注册列表中选择一个地址。
/**
* 实例化RestTemplate
* RestTemplate是Spring提供的用于访问Rest服务的客户端,
* 它提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
使用例子
/**
* 查找与用户相关的订单
*/
@GetMapping("/findOrdersByUser/{id}")
public String findOrdersByUser(@PathVariable String id) {
// 假设用户只有一个订单,并且订单id为123
int oid = 123;
return this.restTemplate
.getForObject("http://microservice-eureka-order/order/" + oid, String.class);
}
使用@Hystrixcommand注解配置错误回调方法
@GetMapping("/findOrdersByUser/{id}")
@HystrixCommand(fallbackMethod = "fallbackInfo")
public String findOrdersByUser(@PathVariable String id) {
// 假设用户只有一个订单,并且订单id为123
int oid = 123;
return this.restTemplate
.getForObject("http://microservice-eureka-order/order/" + oid,
String.class);
}
/**
* 返回信息方法
*/
public String fallbackInfo(@PathVariable String id){
return "服务不可用,请稍后再试!";
}
访问地址:http://localhost:8030/hystrix.stream
核心配置:@EnableHystruxDashboard 数据监控和图形化界面
指标含义:https://github.com/Netfix/Hystrix/wiki/Dashboard
@SpringBootApplication
@EnableHystrixDashboard
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
zuul启动类,多@EnableZuulProxy注解
@EnableZuulProxy
@SpringBootApplication
@EnableEurekaClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
会将注册到Eureka的服务自动映射出来,只需要配置一个
单独使用Zuul:应用本身占用8050端口,访问 http://localhost:8050/order-url/** 该路径会被路由到http://localhost:7900/
server:
port: 8050 # 指定该Eureka实例的端口号
spring:
application:
name: microservice-gateway-zuul # 指定应用名称
zuul:
routes:
order-url:
path: /order-url/**
url: http://localhost:7900/
# prefix: /myapi 前缀
主要用于分布式系统的外部配置提供服务器(Config Server)和客户端(config Client)支持;
服务端:分布式配置中心,独立的微服务应用,集中管理各个环境下的配置,默认使用git存储、可使用svn,或者本地。客户端时微服务架构中的哥哥微服务应用,通过配置中心管理应用资源配置内容。
@EnableConfigServer注解标识服务端,服务端有所有的配置
@EnableConfigServer
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
服务端配置
spring:
application:
name: microservice-config-server
# profiles:
# active: native # 使用本地文件系统的存储方式来保存配置信息
cloud:
config:
server:
git: # 使用git的方式
uri: https://gitee.com/secret8/microservice-study-config.git
server:
port: 8888
客户端有@RefreshScope用于刷新 http://localhost:8801/refresh可刷新(post方法)
@SpringBootApplication
@RefreshScope
@RestController
public class Application {
@Value("${clientParam}")
private String clientParam;
@RequestMapping("/clientParam")
public String getParam(){
return this.clientParam;
}
@RequestMapping("/hello")
public String hello(){
return "hello world";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
客户端配置
spring:
application:
name: microservice-config-client
cloud:
config:
profile: prod # 配置服务中的{profile}
uri: http://localhost:8888/ # 配置中心的地址
server:
port: 8801
微服务源代码 链接: https://pan.baidu.com/s/1FO9dgYRiBJ94J8ICvBpx-A 密码: aeut (找传智博客的客服要的,只有前5章,后面的基本是docker操作和服务部署知识)
PDF链接:https://pan.baidu.com/s/1p2iDNSQ4livEoauYlmGxKg 提取码:4mcn (网上找的,我看的当当云阅读的电子版,无法分享,可以赠送)