1.微服务:
一系列微小的服务共同组成;
跑在自己的进程里
每个服务独立的业务开发
独立部署
分布式的管理
CAP:一致性、可用性、分区容错性,最多满足其中两个,三者不可兼得

2.微服务架构的基础框架/组件:
服务注册发现
服务网关(Service Gateway)
后端通用服务(也称中间层服务Middle Tier Service)
前端服务(也称边缘服务Edge Service):提供对后端通用服务Api的聚合和裁剪

3.Eureka Server
@EnableEurekaServer
eureka:
client:
service-url:
default-Zone: http://localhost:8761/eureka/,http://localhost:8761/eureka/(这里是需要注册到的地址,要分清服务本身的地址和要注册到的地址)
register-with-eureka: false
server:
enable-self-preservation: false 可以关闭自我保护(开发环境,注册中心将不会保留下线的客户端)
nohup java -jar xxx.jar > /dev/null 2>&1 & 可以后台运行并显示进程号
kill -9 进程号 可杀死进程

4.Eureka Client
@EnableDiscoveryClient
@EnableEurekaClient
instance:
hostname: 可以自定义链接
Eureka支持多种注册中心:
@EnableDiscoveryClient注解在使用任何Eureka支持的注册中心时都可以使用,是一个通用的注解。
@EnableEurekaClient注解只有在使用Eureka作为注册中心时才可以使用,是Eureka注册中心的专用注解,在使用其他注册中心的时候不管用。

5.客户端发现与服务端发现
Eureka属于客户端发现
Nginx、Dubbo、Kubernetes属于服务端发现

6.“功能”拆分
单一职责,松耦合、高内聚
关注点分离
职责:业务领域(订单、商品、前端、App接口)
通用性:基础组件(消息、用户)
粒度级别:按照业务决定拆分粒度

7.异常定义
public void create(@Valid OrderForm orderForm, BindingResult bindingResult)
bindingResult.getFieldError().getDefultMessage();
@NotEmpty(message = “错误信息”)

8.“数据”拆分
每个微服务都有单独的数据存储
依据服务特点选择不同结构的数据库类型
确定边界(难点,要针对边界设计API,依据边界权衡数据冗余)

9.应用间通信
客户端负载均衡器:Ribbon
服务发现
服务选择规则
服务监听

RestTemplate
(1)直接使用restTemplate,url写死
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(请求地址, 返回类型);
(2)利用loadBalancerClient获取url,然后使用restTemplate
@Autowired
private LoadBalancerClient loadBalancerClient;
ServiceInstance serviceInstance = loadBalancerClient.choose(服务端服务名);
String url = String.format(“http://%s:%s”, serviceInstance.getHost(), serviceInstance.getPort());
String response = restTemplate.getForObject(请求地址, 返回类型);
(3)使用@LoadBalanced注解
@Autowired
private RestTemplate restTemplate;// 使用Config添加@Bean和@LoadBalanced
String response = restTemplate.getForObject(请求地址, 返回类型);

Feign
启动类:@EnableFeignClients(basePackages = 访问的服务暴露的接口包)
暴露接口:@FeignClient(name = 访问的服务名)

10.Config Server-统一配置中心服务端
@EnableConfigServer
spring.cloud.config.server.git.uri: 配置Git地址
spring.cloud.config.server.git.username: 配置用户名
spring.cloud.config.server.git.password: 配置密码
访问地址:localhost:8080/xxx-a.yml
/{label}/{name}-{profiles}.yml
/分支/服务名-环境.yml

11.Config Client-统一配置中心客户端
spring.cloud.config.discovery.enabled: true
spring.cloud.config.discovery.service-id: 配置中心服务端服务名
spring.cloud.config.profile: 环境名
会根据服务名-环境.yml查找
bootstrap.yml:会优先启动,不会查找数据库等相关配置
application.yml:在扫描数据库配置之后启动,如果缺少数据库配置会报错
xxx.yml放公用配置
xxx-dev.yml放环境独立配置

12.Spring Cloud Bus-利用WebHooks和消息队列实现自动更新配置
(1)Config Server添加配置management.endpoints.web.expose: “*” 暴露对消息队列的接口
(2)使用配置的Config Client中添加@RefreshScope
注:使用@ConfigurationProperties(“XXX”)可以使实体类映射配置文件
(3)在Git上配置WebHooks
http://域名/monitor
application/json

13.RabbitMQ的使用
(1)yml配置
spring.rabbitmq.host: localhost
spring.rabbitmq.port: 5672
spring.rabbitmq.username: guest
spring.rabbitmq.password: guest
(2)接收方添加@RabbitListener(queues = “队列名”)
(3)发送方需要AmqpTemlate类,amqpTemplate.convertAndSend(“队列名”, “内容”);
(4)可以使用@RabbitListener(queuesToDeclare = @Queue(“队列名”))实现自动创建队列
(5)可以使用@RabbitListener(bindings = @QueueBinding(value = @Queue(“队列名”), exchange = @Exchange(“交换机名”)))实现自动创建队列并绑定交换机

14.Spring Cloud Stream(目前只支持RabbitMQ和Kafka)
(1)定义接口StreamClient:
@Input(“队列名”)
SubscribableChannel input();
@Output(“队列名”)
MessageChannel output();

(2)接收端
@EnableBinding(StreamClient.class)
@StreamListener(“队列名”)
public void process(Object message) {}

(3)发送端
private StreamClient streamClient;
streamClient.output().send(MessageBuilder.withPayload(“发送的消息”).build());

(4)绑定
spring.cloud.stream.bindings.队列.group: 服务名
spring.cloud.stream.bindings.队列.content-type: application/json
这样可以使不同的实例监听同一个队列
并且在MQ获取消息时显示对象Json格式

(5)接收端回应
@SendTo(“响应队列名”)

15.服务网关和Zuul
前置 路由 后置 错误:四种过滤器API
@EnableZuulProxy
localhost:网关服务端口/路由到的服务名/接口名
自定义路由:
zuul.routes.自定义名.path: 自定义路由的地址(/xxx/**)
zuul.routes.自定义名.serviceId: 路由到的服务名
(简洁写法:zuul.routes.路由到的服务名: 自定义路由的地址)
查看所有路由:
management.security.enabled: false
访问application/routes
屏蔽路由地址:
zuul.ignored-patterns:
– 屏蔽地址(/**/接口地址)

16.Zuul:Cookie和动态路由
zuul路由不会携带Cookie信息,可以使用zuul.routes.自定义名.sensitiveHeaders:
进行敏感头部过滤

17.Zuul:Pre和Post过滤器
继承ZuulFilter
filterType:return PRE_TYPE;
filterOrder:return PRE_DECORATION_FILTER_ORDER – 1;
shouldFilter:return ture;
run: 实现逻辑
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
request.getParameter(“参数名”);

18.Zuul:限流
时机:请求被转发之前调用

19.Zuul:跨域
需要跨域的方法上增加@CrossOrigin()
或者进行全局的跨域配置:
@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new        UrlBasedCorsConfigurationSource();
        final CorsConfiguration cofing = new CorsCOnfiguration();
        config.setAllowCredentials(true);
        ……
        source.registerCorsConfiguration(“/**”, config);
        return new CorsFilter(source);
    }
}

20.服务容错:Spring Cloud Hystrix
(1)服务降级
优先核心服务,非核心服务不可以或若可用
通过HystrixCommand注解指定
fallbackMethod(回退函数)中具体实现降级逻辑
启动类:@EnableCircuitBreaker
方法:@HystrixCommand(fallbackMethod = “方法名”)
private String 方法名 () {
    return “太拥挤了,请稍后再试~”;
}
Controller:@DefaultProperties(defaultFallback = “方法名”)
可以指定全部的fallbackMethod
(2)超时设置(默认1秒超时)
方法:@HystrixCommand(commandProperties = {@HystrixProperty(name = “execution.isolation.thread.timeoutInMilliseconds”, value = “毫秒数”)})
(3)断路器模式(Circuit Breaker)
线程池隔离
Hystrix自动实现了依赖隔离
关->开->半开->关
服务熔断:@HystrixCommand(commandProperties = {
@HystrixProperty(name = “circuitBreaker.enabled”, value = “true”),// 开启断路器
@HystrixProperty(name = “circuitBreaker.requestVolumeThreshold”, value = “10”),// 一定时间内触发断路器的最小请求数
@HystrixProperty(name = “circuitBreaker.sleepWindowInMilliseconds”, value = “10000”),// 休眠时间窗,断路器打开后,过这段时间之后,会变为半开状态,允许定量请求通过,如果请求成功达到一定比例,则关闭断路器
@HystrixProperty(name = “circuitBreaker.errorThresholdPercentage”, value = “60”)})// 断路器打开的错误百分比条件
(4)使用配置项
方法上加注解@HystrixCommand(commandKey = “定义名,默认方法名”)
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 1000
    commandKey名:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000
(5)feign-hystrix
feign已经引入hystrix包
配置:
feign:
  hystrix:
    enabled: true
在接口里:@FeignClient(name = “服务名”, fallback = Fallback名.class)
@Component
public static class Fallback名 implements 接口名 {
    @Override
    public List list() {
        return null;
    }
}
注:启动类要加ComponentScan(basePackages = “大范围的包”)
如果出现了服务降级,则会进入Fallback里的方法
(6)hystrix-dashboard(可视化组件)
启动类:EnableHystrixDashboard
配置:management:
              context-path: /
浏览器访问:localhost:8080/hystrix

21.服务跟踪(链路监控:Spring Cloud Sleuth)
(1)使用Zipkin进行监控
引入sleuth包和zipkin包后,安装Zipkin,默认端口9411
集合包:spring-cloud-starter-zipkin(包含sleuth和zipkin)
(2)访问localhost:9411/zipkin
(3)配置文件:spring.zipkin.base-url: http://localhost:9411/
// 抽样百分比,默认是0.1,表示只会将10%的请求抽样出去分析
spring.sleuth.sampler. percentage: 1