【架构入门】Springcloud微服务架构-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

【架构入门】Springcloud微服务架构

剑曼红尘 2020-03-09 11:30:05 152

springcloud是微服务架构的集大成者,将一系列优秀的组件进行了整合。基于springboot构建,对我们熟悉spring的程序员来说,上手比较容易。 通过一些简单的注解,我们就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。 在现征集springcloud 微服务架构~

往期精彩干货内容汇总:

小白求助:零基础入门kubernetes需要哪些知识?https://developer.aliyun.com/ask/273946

Flutter有哪些必知的框架原理和常用工具?https://developer.aliyun.com/ask/273907

关于入门微服务,那些你必懂的知识 https://developer.aliyun.com/ask/273861

Java经典1000问https://developer.aliyun.com/ask/257905

Js零基础入门https://developer.aliyun.com/ask/274096

1.png

开发者社区邀你加入钉钉群聊社区问答,和大家一起闲来无事探讨技术二三事,解决技术难题我最行,悠哉游哉技术论文小分享,群内电子技术期刊多多多~点击进入查看详情 https://qr.dingtalk.com/action/joingroup?code=v1,k1,B+0m7X2kV4zJsN9DzgowaMmX4ELIQ0ty96RtPFA9J9Y=&_dt_no_comment=1&origin=11

Kubernetes JavaScript Java 程序员 开发者 微服务 Spring 容器
分享到
取消 提交回答
全部回答(1)
  • 剑曼红尘
    2020-03-09 11:53:43

    相信大家对微服务都不陌生,那我们先来简单回顾下微服务。

    微服务架构是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持。微服务架构是一种架构思想,实际的开发方式是分布式系统开发。这里只是简单的提一下微服务,接下来直接进入到springcloud微服务架构吧。

    Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置 和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

    Spring Cloud不是系统架构或某种技术,它是一个生态圈,在这个生态圈内,集合了快速构建分布式系统的一些优秀的组件与框架。

    想要使用spring cloud 必须基于 spring boot,SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注于全局的服务治理框架。

    在Java生态圈,目前使用较多的微服务框架就是Spring Cloud。它包括:

    Eureka:服务治理组件,包含服务注册中心、服务注册与发现。

    Hystrix:容器管理组件,实现断路器模式,倘若依赖的服务出现延迟或故障,则提供强大的容错功能。

    Ribbon:客户端负载均衡的服务调用组件。

    Feign:基于Ribbon和Hystrix的声明式服务调用组件。

    Zuul:网关组件,提供智能路由、访问过滤等功能。

    Spring Cloud Config:配置管理工具,支持使用Git存储配置内容,可以实现应用配置的外部化存储,支持客户端配置信息刷新、加密/解密配置内容等 ……

    基于springcloud的微服务总体架构如下: 2.png

    接下来会对各组件分块进行介绍,本篇文章先介绍Eureka和ribbon。其他组件后续会持续更新。

    1、eureka服务发现与注册中心

    简介: Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块,负责服务的注册与发现。 3.png

    组成: 由两个组件组成:Eureka Server和Eureka Client,其中Eureka client可以再分为Service Provider和Service Consumer。 4.png

    Eureka Server:服务的注册中心,负责维护注册的服务列表。 Service Provider:服务提供方,作为一个Eureka Client,向Eureka Server做服务注册、续约和下线等操作,注册的主要数据包括服务名、机器ip、端口号、域名等等,Eureka Server会存储这些信息 Service Consumer:服务消费方,作为一个Eureka Client,向Eureka Server获取Service Provider的注册信息,并通过远程调用与Service Provider进行通信。

    eureka集群 5.png 上图为Eureka官方wiki的架构图。 Eureka Server:表示注册中心集群 us-east-xxx:表示集群所在的区域 Application Service:表示服务提供者 Application Client:表示服务消费者 Eureka Client:表示Eureka客户端 如图所示,现在有三个区us-east-1c,us-east-1d,us-east-1e,每个区里都有一个Eureka Server集群,以及不定的Application Service和Application Client。 值得注意的是,注册、续约、下线的请求默认优先选择本区域内的Eureka Server,只有当本区内的Eureka Server都不可用,才会选择其他区的Eureka Server。

    6.png

    2、Ribbon客户端负载均衡组件

    Spring Cloud Ribbon 是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。 通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。 Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。 7.png

    Ribbon 自带的负载均衡策略有如下几个: RoundRibbonRule:轮询。 RandomRule:随机。 AvailabilityFilteringRule:先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,以及并发连接数超过阈值的服务,剩下的服务,使用轮询策略。 WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应越快的服务权重越高,越容易被选中。一开始启动时,统计信息不足的情况下,使用轮询。 RetryRule:先轮询,如果获取失败则在指定时间内重试,重新轮询可用的服务。 BestAvailableRule:先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务。 ZoneAvoidanceRule:复合判断 server 所在区域的性能和 server 的可用性选择服务器

    3、环境搭建+代码

    代码是最好的老师,不多说来敲个例子叭! 本例包含一个Eureka-server集群,和两个Eureka-client。在这里又将Eureka-client分为一个提供者服务provider和一个消费者服务consumer。

    一、Eureka-server

    1.新建一个空文件夹用IDEA打开 springcloudtest 2.在springcloudtest中新建Module:erueka_server1(erueka_server2,erueka_server3相同,只是yml配置文件不同) 8.png pom选择如上图。生成的pom依赖如下 9.png

    在启动类上加上注释:@EnableEurekaServer 10.png yml配置如下: 11.png 12.png 13.png

    注意: yml中的hostname: eureka1 需要在当前电脑中进行ip映射: 14.png

    目录结构如下图

    15.png

    二、Eureka-client 在这里又将Eureka-client分为provider和consumer 先看provider的:

    1.新建module:eureka_client_provider 16.png

    pom.xml中依赖为: 17.png

    2.然后在启动类上加注解:@EnableDiscoveryClient 18.png

    3.ym配置如下: 19.png

    4.写一个简单的测试,provider作为consumer的提供者 写一个serviceProviderController类,为consumer调用provider返回一个端口信息。 20.png

    项目的目录机构如下: 21.png

    如果有多个提供者写法同上。

    再来看consumer的 1.新建module:eureka_client_consumer 22.png

    pom.xml依赖: 23.png

    2.在启动类上添加注解:@EnableDiscoveryClient 24.png

    3.yml配置 25.png

    4.开启ribbon的负载均衡功能 写RestTemplateConfiguration类,加上注释:@LoadBalanced 26.png

    5.写一个简单的测试! 27.png

    目录结构如下: 28.png

    需要多个consumer的时候和上面写法一样。 测试 启动后,访问consumer即可,项目没开就不截图了。 欢迎大家批评指正,有兴趣可以一起探讨呀~

    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程