java微服务架构知识入门_java 微服务基本知识_贺贺42的博客-程序员宅基地

技术标签: java学习  

一、互联网技术的发展

1.集中式架构

缺点:

  1. 代码耦合,维护成本高
  2. 无法针对不同的模块进行精准优化
  3. 无法水平扩展,可扩展性弱
  4. 单点容错率低,并发能力弱

2.垂直拆分

优点:

  1. 解决了并发问题,系统拆分流量,分担系统压力。
  2. 可以针对每个模块进行优化,耦合度少了。
  3. 方便水平扩展,负载均衡,容错率提高了。
    缺点:
  4. 耦合度虽然低了,但是重复代码多了,各个系统相互独立,降低了开发效率。

3.分布式服务

当服务越来越多时,重复的代码就会被抽取出来,作为一个单独的服务,逐渐成为稳定的服务中心,这样服务和服务之间的调用就不可避免。
所以优点就是:把重复的业务抽取出来,提高了代码的复用率,降低了代码的重复率,提高了开发效率。
缺点就是:服务变多以后,服务与服务之间的调用错综复杂。

4.流动计算架构(SOA)

当服务变多以后,服务与服务之间的调用,服务的调度问题明显,所以需要一个服务中心来调度服务集群,根据压力来实时调度,这就是提高机器利用率的资源调度和治理中心(SOA)的出现。
优点:

  1. 解决服务变多,要管理服务地址的问题,通过服务注册中心,实现服务的自动注册和发现,不用人工记录服务地址。
  2. 解决了服务关系复杂,无法找到依赖关系,服务自动订阅,服务列表自动推送,服务调用透明,不用关心依赖关系。
  3. 解决了服务过多,服务状态难以管理,不能根据服务当时的情况进行动态管理,动态监控服务状态,并有监控报告,就可以动态的管理服务状态。

缺点:
4. 服务间会有依赖,调用错综复杂,中间出了问题,会导致一系列问题,服务关系复杂,测试运营部署困难,不符合DevOps思想。

5.微服务

前面说的SOA,虽说也是面向服务,和微服务一样,也是拆分系统,但是还是有一些差距的。微服务主要为以下几个特点:

  1. 微:服务拆分粒度很小,一个用户管理业务就可以作为一个服务,虽小但”五脏俱全“。

  2. 单一职责:每一个服务都只完成最小的一个业务,做到单一职责。

  3. 面向服务:面向服务是服务只提供Rest风格的Api接口,不关心内部是怎么实现的,不关心是什么语言实现的,只需要提供对应业务的接口即可。

  4. 自治:服务间互相独立,互不影响。

    • 团队独立:一个团队负责一个服务,相互不关联。
    • 技术独立:因为是提供Rest接口,没人限制使用什么技术。
    • 前后端分离:前后端分离开发,通过Rest接口相连接,后端开发人员不必在为pc端和移动端开发不同的接口。
    • 数据库独立:一个服务有自己相对应的数据源。
    • 部署独立:每一个服务之间虽然有调用,但是服务重启不会影响其他服务的运行,有利于持续集成,持续交付。每一个服务是独立的组件,降低耦合,可复用,可替换,易维护。

二、服务的远程调用

不管是SOA还是微服务都要面临服务调用的问题。现在流行的两种调用方式,远程调用方式RPC和Http方式。

1.RPC

是基于原生TCP的方式,早期的webservice,现在热门的dubbo,都是RPC的典型代表。特点是速度快,效率高。
缺点是受限于技术,不适合多种技术栈一起开发。

2.Http

是基于TCP的,缺点是消息封装臃肿,优点是基于Rest开发风格的,更符合微服务的特点,不受技术的影响,自由灵活。代表:SpringCloud搭建微服务。

3.SpringCloud简介

SpringCloud是Spring旗下的项目之一,官网地址:http://projects.spring.io/spring-cloud/

Spring最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中。

SpringCloud也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。其主要涉及的组件包括:

  • Eureka:服务治理组件,包含服务注册中心,服务注册与发现机制的实现。(服务治理,服务注册/发现)
  • Zuul:网关组件,提供智能路由,访问过滤功能
  • Ribbon:客户端负载均衡的服务调用组件(客户端负载)
  • Feign:服务调用,给予Ribbon和Hystrix的声明式服务调用组件 (声明式服务调用)
  • Hystrix:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力。(熔断、断路器,容错)

三、Eureka

Eureka架构中三个核心角色:

  • 服务注册中心:
    Eureka的服务端应用,提供服务注册和发现功能。
    注册中心也可以是集群的,相互进行注册,当服务提供者注册给了一个注册中心,数据会共享,所有的注册中心都可以获取到完整的服务列表。

  • 服务提供者:
    提供服务的应用,可以是SpringBoot应用,也可以是其它任意技术实现,只要对外提供的是Rest风格服务即可。
    服务提供者会向Eureka发送Rest请求,并携带自己的元数据,Eureka会保存到一个双层Map中。

    • 第一层Map的Key就是服务id,一般是配置中的spring.application.name属性
    • 第二层Map的key是服务的实例id。一般host+ serviceId + port,例如:locahost:service-provider:8081
    • 值则是服务的实例对象,也就是说一个服务,可以同时启动多个不同实例,形成集群。
  • 服务消费者:
    消费应用从注册中心获取服务列表,从而得知每个服务方的信息,知道去哪里调用服务方。

四、Ribbon

Ribbon的负载均衡策略为:轮询或者随机,策略可以通过配置文件修改。

五、Hystrix

Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。

  1. 雪崩问题:
    在微服务中,服务与服务之间的调用特别复杂,假如在运行当中有一个微服务挂掉了,那么如果调用这个微服务的其他服务很多,问题又得不到很快的解决,那么调用服务的微服务队列就会满,然后导致像雪崩一样的效应,随着一个服务的宕机,导致大规模服务的宕机。

    解决这一问题,Hystix提供两种解决办法:线程隔离和服务降级。
    线程隔离:给每一个小的服务都开辟一些数量较小的线程,当调用这个微服务的队列服务线程已满后,就会启用服务降级。
    服务降级:优先保证核心服务,而非核心服务不可用或者弱可用。导致服务降级的两种情况,某一服务的线程池已满或请求超时,这时会给用户返回一个友好的提示,而不会是无限的等待,并且不会造成更大的损失。

  2. 服务熔断:
    熔断状态机3个状态:

    • Closed:关闭状态,所有请求都正常访问。
    • Open:打开状态,所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。
    • Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,否则继续保持打开,再次进行休眠计时

Fegin

Fegin使我们更快捷,更优雅的调用HTTP API 。使用简单的注解开发,就可以轻松达到调用其他服务的需求。

Zuul

Zuul是整体架构的门户,所有要调用微服务的请求都要经过它,它可以说是一道门,一夫当关,万夫莫开。

服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由均衡负载功能之外,它还具备了权限控制等功能。
Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性可测试性。

加入Zuul网关后的整体架构

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43296480/article/details/103226898

智能推荐

虚拟服务器与物理服务器的区别是什么?_物理服务器和虚拟服务器的区别-程序员宅基地

虚拟服务器与物理服务器的最大区别就在于:物理服务器就是我们常说的独立服务器(实体机),很多资源都是独享的,稳定性要比虚拟主机强,功能强大,想要的功能基本都有。 虚拟主机是物理主机通过虚拟化技术分隔出来的,一台物理主机可分割多个虚拟主机,虚拟主机的优势是成本低,扩展性好,但是比较缺点的是受其它网站的影响,共享服务器资源。..._物理服务器和虚拟服务器的区别

JSONObject to bean_人间无味98727的博客-程序员宅基地

eviceOperate deviceOperate = new DeviceOperate();deviceOperate.setServiceId("1111111");deviceOperate.setId(1);deviceOperate.setMac("2222222");Map,Object> map = new HashMap, Object>();map.put("pa

mysql查询时区分大小写的方法_mysql查询条件区分大小写_daijiguo的博客-程序员宅基地

mysql> create table case_test (word VARCHAR(10)) CHARACTER SET latin1; Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO case_test VALUES ('Frank'),('Google'),('froogle'),('flickr'),('Flic_mysql查询条件区分大小写

关于UITabBar配置_标哥-iOS攻城狮的博客-程序员宅基地

为了适配6.0版本,需要做额外处理,同时由于7.0版本以后新增了一些API,如果没有注意到这些变化,设置了图片并没有达到预期的效果。下面是关键代码,适配了6.0: UITabBarItem *item2 = [[UITabBarItem alloc] init]; item2.title = @"消息"; if (kIOSVersion >= 7) {

基于新代数控系统PLC基础语法汇总_新代cmpe指令_老爷爷的茶壶的博客-程序员宅基地

最近项目要使用到新代数控系统,被逼无赖的学一下PLC的基础编程,如下是新代PLC编程的基础语法:_新代cmpe指令

cuda runtime error (10) : invalid device ordinal at torch/csrc/cuda/Module.cpp:88_runtimeerror: cuda runtime error (10) : invalid de_一半西瓜的博客-程序员宅基地

赞赏码 & 联系方式 & 个人闲话我在执行torch.load时遇到该报错,感到非常奇怪。因为我只有一块GPU,怎么会出现无效的设备序号呢?查找__init__.py报错源码,发现self.idx的值确实为1,然而应该为0。仔细看load函数的注释会发现已经写明解决方法。"""Loads an object saved with :func:`torch.save..._runtimeerror: cuda runtime error (10) : invalid device ordinal at ../torch/c

随便推点

Lombok配置和使用_lombok的配置_Nuyahy的博客-程序员宅基地

Lombok到底是什么先看一下它的官网大致意思是:Lombok项目是一个Java库,它会自动插入您的编辑器和构建工具中,从而为您的Java增光添彩。永远不要再编写另一个getter或equals方法,带有一个注释的类将具有功能全面的生成器,自动执行日志记录变量等等。听起来好像是挺不错吼,亲自尝试一下吧!项目中引入Lombok首先在项目的 pom.xml中引入 Lombok依赖:如..._lombok的配置

计算机主机加固方案介绍_主机设备加固方案_Cnsidna.No.1的博客-程序员宅基地

深信达主机加固解决方案是从保护数据角度出发,通过对操作系统镜像快照,从镜像快照中提取工作场景、业务数据访问行为、业务场景等,建立安全容器,对主机操作系统和业务程序进行签名加固,对数据的访问进行验证审计,杜绝非法数据使用,以不变应万变的白名单模式,对操作系统和数据进行保护,杜绝勒索病毒以及其他病毒、黑客的攻击行为。7、安全意识培训:对员工和广大计算机用户进行持续的安全教育培训是十分必要的,应当让用户了解勒索软件的传播方式,如社交媒体、社会工程学、不可信网站、不可信下载源、垃圾邮件和钓鱼邮件等。_主机设备加固方案

conda常用命令总结(持续更新)_conda常用指令_DebugYing的博客-程序员宅基地

常见的conda指令:查看已有的conda环境:conda info --envs创建一个名为pytorch的环境,指定Python版本是3.6:conda create --name pytorch python=3.6进入某虚拟环境: conda activate 虚拟环境名字退出虚拟环境: conda deactivate 虚拟环境名字删除虚拟环境:conda remove --name 虚拟环境名字 --all查看当前环境下已安装的包:conda list查找包信_conda常用指令

THREEJS实现标签,自定义样式显示标签,在场景图上动态标识一些文字方法一(css2d_label)_thrree.js实现标签_WFF的赵本山的博客-程序员宅基地

方法:css2d_label特点:显示的标签大小固定,不会随窗口的大小而变化。<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> <title>three._thrree.js实现标签

xshell启动tomcat项目报500_YingTao8的博客-程序员宅基地

import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.*;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnectio...

聊聊引擎底层如何实现SSAO渲染_海洋_的博客-程序员宅基地

SSAO被称为屏幕空间环境光遮蔽,它的原理是:对于铺屏四边形(Screen-filled Quad)上的每一个片段,我们都会根据周边深度值计算一个遮蔽因子(Occlusion Factor)。这个遮蔽因子之后会被用来减少或者抵消片段的环境光照分量。遮蔽因子是通过采集片段周围球型核心(Kernel)的多个深度样本,并和当前片段深度值对比而得到的。高于片段深度值样本的个数就是我们想要的遮蔽因子。SS...

推荐文章

热门文章

相关标签