vieyahn2017 / javaway

java on the way
5 stars 3 forks source link

1.21 SpringCloud技术贴汇集 #90

Closed vieyahn2017 closed 1 year ago

vieyahn2017 commented 5 years ago

什么是微服务?

简而言之,微服务架构风格这种开发方法,是以开发一组小型服务的方式来开发一个独立的应用系统的。 其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API这样轻量的机制来相互通信。 这些服务围绕业务功能进行构建,并能通过全自动的部署机制来进行独立部署。 这些微服务可以使用不同的语言来编写,并且可以使用不同的数据存储技术。对这些微服务我们仅做最低限度的集中管理。

微服务具备的特性:

1.每个微服务都可独立运行在自己的进程里。 2.一系列独立运行的微服务共同构建起了整个系统。 3.每个服务为独立的业务开发,一个微服务一般完成某个特定的功能,比如:订单管理、用户管理等; 4.微服务之间通过一些轻量级的通信机制进行通信,例如通过REST API或者RPC的方法进行调用。

微服务的优点:

1.易于开发和维护 2.启动较快 3.局部修改容易部署 4.技术栈不受限制 5.按需收缩 6.Devops(即便于各个部门之间相互沟通与协作)

Spring Cloud

Spring Cloud基于Spring Boot,提供了多个组件来帮助企业进行微服务系统建设; 它提供的主要功能有:服务注册中心/服务注册/服务调用/负载均衡/断路器等; 一般情况下它都是使用已有的开源软件,在其基础上按Spring Boot的理念来进行封装,简化各种个组件的调用以及各个组件之间的交互。

vieyahn2017 commented 5 years ago

SpringCloud之zuul微服务网关

2018年07月02日 00:07:51 qyj19920704 阅读数:202 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qyj19920704/article/details/80878804

服务网关API Gateway

可以有很多实现方法,如Nginx、Zuul,甚至是一个Node.js的服务端。它们最重要的作用是为前台提供后台服务的聚合,提供一个统一的服务出口, 解除它们之间的耦合,同时负责鉴权、认证、安全和跳转等作用。 Zuul是边缘服务,用来提供动态路由、监控、鉴权、安全、调度等功能,将权限控制等一些业务逻辑抽离出来,单独放到Zuul里,使得服务组件更简单,具有更好的可复用性。 Zuul是反向代理工具,代理了后台的所有服务端,前端请求不需要知道真正的服务端是谁,只要交给Zuul就可以了,Zuul负责路由到真正的服务商。

图例

Zuul做为网关层,自身也是一个微服务,跟其它服务Service-1,Service-2, … Service-N一样,都注册在eureka server上,可以相互发现,zuul能感知到哪些服务在线,同时通过配置路由规则(后面会给出示例),可以将请求自动转发到指定的后端微服务上,对于一些公用的预处理(比如:权限认证,token合法性校验,灰度验证时部分流量引导之类),可以放在所谓的过滤器(ZuulFilter)里处理,这样后端服务以后新增了服务,zuul层几乎不用修改。

pom

 <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

路由

zuul中自动引入了Ribbon和Hystrix

说明

register-center(服务注册) config-server(配置服务) service-provider(服务提供者) service-consumer(服务消费者) service-gateway(微服务网关)

系统级别

高可用性 均衡负载: 容错,防止雪崩. 并发控制 : 错峰流控 动态路由制定和修改

应用级别

监控统计 版本控制 认证 鉴权 数据安全: 防篡改,参数脱敏… 协议转换: 如 HTTP => RPC协议.

网关(API Gateway)技术选型

  1. zuul
  2. kong
  3. nginx+lua

网关(API Gateway)的设计要素

  1. 限流:实现微服务访问流量计算,基于流量计算分析进行限流,可以定义多种限流规则。
  2. 缓存:数据缓存。
  3. 日志:日志记录。
  4. 监控:记录请求响应数据,api耗时分析,性能监控。
  5. 鉴权:权限身份认证。
  6. 灰度:线上灰度部署,可以减小风险。
  7. 路由:路由是API网关很核心的模块功能,此模块实现根据请求,锁定目标微服务并将 请求进行转发。

简单介绍下你的网关实施方案

  1. 开发语言:java + groovy,groovy的好处是网关服务不需要重启 就可以动态的添加filter来实 现一些功能;
  2. 微服务基础框架:springboot;
  3. 网关基础组件:netflix zuul;
  4. 服务注册中心:consul;
  5. 权限校验:jwt;
  6. API监控:prometheus + grafana;
  7. API统一日志收集:logback + ELK;
  8. 压力测试:Jmeter;
vieyahn2017 commented 5 years ago

我搭的demo:

ixxx-microservice

基于SpringCloud微服务框架

eureka

服务的注册与发现
端口8761

zuul

服务网关
端口8080
在一般情况下,我们不会直接暴露客户端给外部,而是通过服务网关来转发, 内部服务都是在局域网内通信,外部访问不了。 通过服务网关,我们还可以统一做接口的安全性校验,统一拦截 参考 https://blog.csdn.net/qyj19920704/article/details/80878804

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8080
spring:
  application:
    name: service-zuul

zuul:
  routes:
    api-a:
      path: /sa/**
      serviceId: service-a
    api-b:
      path: /sb/**
      serviceId: service-b
    api-c:
      path: /sc/**
      serviceId: service-c

config

服务配置中心(可以暂时不管)
(为微服务各应用提供了一个中心化的外部配置)
端口8767, 8768

user

用户系统(可以暂时不管)
端口8760

service-xxx

微服务业务子模块

service-a

端口8771

service-b

端口8772

service-c

端口8773

微服务子业务端口不对外暴露,统一通过zuul服务网关转发
http://localhost:8080/sb/api/v1/dataAsset
http://localhost:8772/api/v1/dataAsset
这两个地址是一样的

vieyahn2017 commented 5 years ago

扩展学习

Hystrix是Netflix开源的一款容错框架,包含常用的容错方法:
线程池隔离、信号量隔离、熔断、降级回退。
在高并发访问下,系统所依赖的服务的稳定性对系统的影响非常大,依赖有很多不可控的因素,比如网络连接变慢,资源突然繁忙,暂时不可用,服务脱机等。
我们要构建稳定、可靠的分布式系统,就必须要有这样一套容错方法。

ribbon

负载均衡器,实现了断路器功能
参考 https://blog.csdn.net/cheidou123/article/details/78824140

feign

负载均衡器,集成了ribbon框架,实现了断路器功能