对SpringCloud微服务架构的理解

微服务

微服务 将all in one的项目拆分,可以按业务拆分成独立的模块等,降低模块与模块之间的耦合性,每个微服务还能有自己独立的数据库。每个微服务在自己独立的进程中运行,不会互相干扰。异构。支持不同语言、不同类型的数据库

集群:一组集成的计算机软件连接起来

  • 高性能:多台计算机完成同一工作,分摊压力
  • 高可用:多台计算机工作内容、过程一致,可以相互顶替

分布式:一组计算机通过网络通信协调它们之间的行为。组件之间交互来实现一个共同的目标。

  • 低耦合:模块间独立,易扩展,提高资源利用率
  • 高吞吐:功能拆分,分散到不同的模块执行

集群和分布式不冲突。分布式的某个需要扩展的模块可以使用集群。

CAP:强一致性C、极致可用性A、分区容错性P。这三个不能同时满足。

微服务的特点:

  • 一系列微小的服务共同组成
  • 单独部署,跑在自己的进程里
  • 每个服务是独立的业务开发
  • 分布式的管理

不适合微服务的:

  • 系统中包含很多很多强事务场景的
  • 业务相对稳定,迭代周期长
  • 访问压力不大,可用性不高

服务拆分的方法:

  • 如何拆“功能:
    • 单一职责,松耦合、高内聚
    • 关注点分离
      • 按职责
      • 按通用性
      • 按粒度级别
  • 服务和数据的关系
    • 先考虑业务功能,再考虑数据
    • 无状态服务(数据不被服务依赖)

微服务架构

这是一种新型、轻量的架构,利用REST API来保持微服务之间的通信。与dubbo不同的是,dubbo用的是rpc通信。

维度:开发、配置与管理、消息队列、服务接口调用、治理、注册与发现、负载均衡、监控。。。。

SpringCloud微服务架构:

image.png

这里面的常用组件:

  • 服务治理:Spring Cloud Eureka
  • 负载均衡:Spring Cloud Ribbon
  • 熔断限流:Spring Cloud Hystrix
  • 服务调用:Spirng Cloud Feign
  • 网关服务:Spring Cloud Zuul/Gateway
  • 配置中心:Spring Cloud Config
  • 消息总线:Spring Cloud Bus
  • 消息驱动:Spring Cloud Stream
  • 服务追踪:Spring Cloud Sleuth

Spring Cloud网关 (Zuul/GateWay)

应用场景:统一外部入口、请求路由、认证授权、请求限流、请求日志和监控

SpringCloud Zuul功能:①服务路由,②自定义过滤器,需要继承ZuulFilter并重写方法。下面的Autorizefilter模拟身份验证功能,它继承了ZuulFilter抽象类,重写了filterType filterOrder shouldFilter run方法

@Component
public class Authorizefilter extends ZuulFilter {
    private static final Logger logger = LoggerFactory.getLogger(Authorizefilter.class);
    private static String access_token;

    public Authorizefilter(){
        access_token = UUID.randomUUID().toString();
        logger.info(access_token+"-==========----------");
    }
    /**
     * 外部请求-> zuul-(pre) ->选择路由的服务-(routing) ->请求服务-(post) ->zuul
     * pre:在请求路由之前执行
     * routing:在请求路由之后执行
     * post:在请求路由到服务之后执行
     * error:在其他阶段发生错误的时候执行
     * @return 过滤器的类型是什么
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     *
     * @return 过滤器执行的顺序
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     *
     * @return 是否执行过滤器
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 具体逻辑
     * @return Some arbitrary artifact may be returned. Current implementation ignores it.
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();
        String access_token = request.getParameter("access_token");
//        模拟授权
        if (Objects.equals(access_token,Authorizefilter.access_token)){
            requestContext.setResponseStatusCode(HttpStatus.OK.value());
            requestContext.setResponseBody("Authorize");
            requestContext.setSendZuulResponse(false);
        }else {
            requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
            requestContext.setResponseBody(HttpStatus.UNAUTHORIZED.getReasonPhrase());
            requestContext.setSendZuulResponse(false);
        }
        return null;
    }
}

Spring Cloud GateWay出现是由于Zuul 在2版本后不维护了,它是zuul的扩展。

SpringCloud服务治理 (Eureka/Consul)

  • Eureka Client:服务注册
  • Eureka Server:服务发现

Eureka:保证了高可用性A

  • 服务注册快,不需要等待注册信息复制到其他节点,也不保证复制成功
  • 当注册信息不相同时,每个Eureka节点依然能够正常对外提供服务

Consul:保证强一致性C

  • 服务注册相比Eureka会稍慢,Consul要求过半的节点都写入成功
  • Leader挂掉时,在有新的Leader之前整个Consul不可用

对Eureka Server端的application使用@EnableEurekaServer注解表示加载EurekaServer的配置;

在客户端Client,对application使用@EnableDiscoveryClient注解表示加载EnableDiscoveryClientImportSelector的配置,用于被Service发现

服务发现的两种方式:客户端发现(Eureka),服务器发现(Nginx、Zookeeper、Kubernetes)

SpringCloud服务调用(Feign)

  • RestTemplate 利用它的public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException方法 获取url地址对应接口的返回对象,后面的uriVariables是url中的参数;url中的ip可以为通信服务的application name
  • Feign
    • 需要在Application上添加@EnableFeignClients
    • 自定义一个接口,添加@FeignClient(name = "application name")注解,并且写出想要使用服务的接口

Feign 采用了基于注解的接口,是声明式REST客户端(虽然在他的接口中看不到http请求)

SpringCloud 配置中心(Config)

为啥使用配置中心?

当把配置文件都放在项目包下,不方便之后的维护;需要测试时,对配置文件修改之后,不方便另外的人员维护;配置内容中数据库的账号密码不能随意暴露给开发者;更新配置项目需要重启。

统一配置中心?

  • config-server 从远端git pull下来放在本地git;如果远端git挂掉,可以使用本地git

如何配置?

  • 配置Config的Server端

    1. 配置pom文件,加入spring-cloud-config-server依赖和spring-cloud-starter-netflix-eureka-client依赖

    2. 给Application文件添加@EnableConfigServer和@EnableDiscoveryClient(将它注册)

    3. 添加yml配置,下面的配置中basedir的目录是远程的配置拉下来的所在文件夹

      spring:
        application:
          name: config
        cloud:
          config:
            server:
              git:
                uri: https://gitee.com/luotianhao25182/config
                username: 18235190623
                password: iamlth0539cro
                basedir: F://config
      eureka:
        client:
          service-url:
            defaultZone: http://localhost:8761/eureka/
      
    4. 远端的配置文件的命名要对应它的application name。在配置服务器端使用url访问加上如/{name}-{profiles}.yml或/{label}/{name}-{profiles}.yml来访问远端的配置文件。

  • 配置config的客户端

    1. 给pom添加spring-cloud-config-client依赖

    2. 给Application添加@EnableDiscoveryClient注解,将服务客户端注册

    3. 将原来的application.yml改名为bootstrap.yml,并添加如下内容。其中的enabled表示需要从配置服务端拿配置,service-id的内容表示的是配置服务中心的application name

      spring:
        application:
          name: client
        cloud:
          config:
            discovery:
              enabled: true
              service-id: CONFIG
      

配置服务中心可以看作: 远端git仓库——配置中心服务端——配置客户端

在远端git仓库中,最好是将一个服务共有的配置提取出来为 如client.yml,再将不同配置放入如client-dev.yml等中。为什么要这样做?因为配置客户端会将远端的带client命名的所有yml拉下来并且合并起来,所以如果两个配置文件一样,你只改了其中一个文件是等于无效的。

SpringCloud配置中心配置同步

当我们在远端git仓库上修改了配置文件之后,其实我们的配置服务端并没有做出响应,那么也就没有说把新的配置文件传给下面的配置客户端,我们只能通过重启配置服务器来同步。但是这样做显得过于不便,现在可以使用Bus这个组件来实现配置中心配置同步。

image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容