大型分布式网站架构设计--第1章 面向服务体系的架构

news/2024/5/12 21:59:31/文章来源:https://blog.csdn.net/wu2374633583/article/details/80679629

本章目录:
这里写图片描述


分布式Java应用图:

这里写图片描述

分布式Java应用:大型系统会被拆分成多个子系统来实现,对于Java来说,这些子系统可能部署在同一台机器上不同的JVM,或者部署在不同机器上,但是这些子系统之间要进行相互通信来共同实现业务功能。

分布式应用架构的演变
这里写图片描述

分布式应用架构面临的首要问题,便是如何实现应用之间的远程调用(RPC)。有两种方式:一种是基于HTTP的RPC,一种是基于TCP的RPC。

1.1 基于TCP的RPC

1.1.1 RPC名词解释

RPC也就是远程调用,RPC的实现包括客户端和服务端,也就是服务提供方和服务调用方,服务调用方发送RPC请求到服务提供方,服务提供方根据服务调用方的参数执行请求方法,将执行结果返回给调用方,这就是一次RPC请求。
这里写图片描述
这里写图片描述

1.1.2 对象的序列化

要注意 无论是什么类型的数据,最终都是要转成二进制在网络上传输。

对象的序列化:就是将对象转成二进制流的过程。
对象的反序列化:就是将二进制流转成对象的过程。
Java中的序列化代码:

    //定义一个字节数组的输出流ByteArrayOutputStream os=new ByteArrayOutputStream();//对象的输出流ObjectOutputStream out=new ObjectOutputStream(os);//将对象写入字节数组输出,进行序列化out.writeObject(zhangsan);      byte[] zhangsanByte=os.toByteArray();

反序列化代码:

ByteArrayInputStream is=new ByteArrayInputStream(zhangsanByte);
//执行反序列化 从流中读取对象
ObjectInputStream in=new ObjectInputStream(is);
Person person=(Person) in.readObject();

1.1.3 基于TCP协议实现RPC

基于Java的socket API 实现一个简单的RPC,这里面包括了服务接口,接口的远端实现,服务的消费者和远端的提供方。


1.2 基于HTTP协议的RPC

1.2.1 HTTP协议栈

这里写图片描述

1.2.2 HTTP请求与响应

这里写图片描述

1.2.3 通过HTTPClient发送HTTP请求

package com.openapi.TestPojo;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
/*** 利用HttpClient发送HTTP请求* @author Administrator**/
public class MyHttpClient {public static void main(String[] args) {String url="http://www.baidu.com";CloseableHttpClient client = HttpClients.createDefault();String result="";try {result=doPost(client, url);} catch (Exception e) {e.printStackTrace();} System.out.println(result);}/***  get请求* @param client* @param url* @return* @throws ClientProtocolException* @throws IOException*/public static String  doGet(CloseableHttpClient client,String url) throws ClientProtocolException, IOException{//注意get如果想添加参数可以直接在url后面拼接HttpGet httpGet=new HttpGet(url);HttpResponse response=client.execute(httpGet);HttpEntity entity=response.getEntity();byte [] bytes=EntityUtils.toByteArray(entity);String result=new String(bytes,"utf8");     return result;}/*** post请求* @param client* @param url* @return* @throws ClientProtocolException* @throws IOException*/public static String  doPost(CloseableHttpClient client,String url) throws ClientProtocolException, IOException{//post请求的参数List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("name", "value"));HttpPost httpPost=new HttpPost(url);//设置参数httpPost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));   HttpResponse response=client.execute(httpPost);HttpEntity entity=response.getEntity();byte [] bytes=EntityUtils.toByteArray(entity);String result=new String(bytes,"utf8");return result;}
}

1.2.4 使用HTTP协议的优势

1.2.5 JSON和XML

JSON和对象的转化

案例1
将java对象JSON序列化
需要的jar包
这里写图片描述

jar包下载

        Person person=new Person();person.setName("wuk");person.setPassword("123");JSONObject json= JSONObject.fromObject(person);System.out.println(json);

JSON串转成对象

        String jsonStr="{\"password\":\"123\",\"name\":\"wuk\"}";JSONObject jo=JSONObject.fromObject(jsonStr);Person person=(Person) JSONObject.toBean(jo,Person.class);System.out.println(person);
xml和对象的转换

需要的jar包
xstream-1.4.10.jar

案例1
Java对象转成XML

package com.wuk.xml;import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;public class XMlTest {public static void main(String[] args) {Person person = new Person();person.setName("wuk");person.setPassword("123");//将对象序列化成xmlXStream stream=new XStream(new DomDriver());//设置person类的别名stream.alias("person", Person.class);String personXml = stream.toXML(person);System.out.println(personXml);}}

案例2
xml转成Java对象

package com.wuk.xml;import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;public class XMlTest2 {public static void main(String[] args) {//将对象序列化成xmlXStream stream=new XStream(new DomDriver());//XStream对象设置默认安全防护,同时设置允许的类//否则就会报警告 Security framework of XStream not initialized, XStream is probably vulnerable.XStream.setupDefaultSecurity(stream); stream.allowTypes(new Class[]{Person.class});  //设置person类的别名stream.alias("person", Person.class);String xml="<person><name>wuk</name><password>123</password></person>";Person person=(Person) stream.fromXML(xml);System.out.println(person);}}

1.2.6 RESTful和RPC

目前有两种主流的URL链接风格:一种是RPC,一种是REST。
RPC就是平时常见的链接请求。
RESTful风格的思想就是通过HTTP的不同请求方式POST,GET,PUT,DELETE完成对应的CRUD操作。
采用springmvc来实现RESTful风格的url操作。
这里写图片描述

1.2.7 基于HTTP协议的RPC的实现


1.3 服务的路由和负载均衡

1.3.1 服务化的演变

分布式应用架构体系对于业务逻辑复用的需求十分强烈,上层业务都想借助已有的底层服务,快速搭建更丰富的应用。
公共业务被拆分出来,形成可共用的服务,最大程度保障代码和逻辑的复用。这种设计被称为SOA。
在SOA架构中,服务消费者通过服务名称,在众多服务中找出要调用的服务的地址列表,称为服务的路由。
这里写图片描述

对于负载较高的服务来说,往往对应着由多台服务器组成的集群,当请求到来时候,为了将请求均衡地分配到后端服务器,负载均衡程序将从服务对应的地址列表中,通过相应的负载均衡算法和规则,选取一台服务器进行访问,这个过程称之为服务的负载均衡。
这里写图片描述

当服务规模小的时候,可采用硬编码方式将服务地址和配置写在代码中,解决服务路由和负载均衡问题。也可通过LVS或者Nginx解决。
这里写图片描述

当服务和规模越来越大,对应的机器数量越多,依靠单一的硬件负载均衡和使用LVS,Nginx进行路由和负载均衡,容易出现单点故障问题(单个点发生故障的时候会波及到整个系统或者网络,从而导致整个系统或者网络的瘫痪),一旦服务路由或者负载均衡服务器宕机,依赖他的所有服务均会失效。
这里写图片描述

这时需要一个能够动态注册和获取服务信息的地方来统一管理服务名称和对应的服务器列表信息,称为服务配置中心

服务提供者将服务名称和地址注册到服务配置中心,服务消费者通过服务配置中心来获取要调用的机器列表,然后通过负载均衡算法,选取其中一台进行调用。
当服务器宕机或下线时,相应的机器能够在配置中心中动态移除,并通知消费者。注意消费者只需要在第一次调用时候需要查询服务配置中心,然后将查询信息缓存在本地,然后根据对一台服务器发起RPC调用,后面只需要调用本地信息,直到配置中心发生上述变更。

我们可以使用Zookeeper搭建服务配置中心,如下:
这里写图片描述

1.3.2 负载均衡算法

前面说到消费者从配置中心获取到服务的地址列表,然后选取一台服务器发起RC调用,在如何选择服务器的问题上采用了负载均衡算法,但是对于不同场景负载均衡的算法不同,有:轮询法,随机法,源地址哈希法,加权轮询法,加权随机法,最小连接法。

1 轮询法

将请求按照顺序轮流分配到后端服务器,他均衡地对待后台的每一台服务器,不关心服务器实际的连接数和当前的系统负载。

使用的目的在于希望请求转移的绝对均衡,但是付出的是性能代价。

2 随机法

通过系统随机函数,根据后台服务器列表的值得大小,随机选择一台访问。但是随着调用量的增大,实际效果接近于轮询法。

3 源地址哈希法

思想是获取客户端访问的IP,通过哈希计算得到一个值,用该值对服务器列表的大小进行取模运算,得到的结果便是要选择的服务器的序。注意同一个IP客户端,当后台服务器列表不变,每次都会被映射到指定的服务器,这样就可以在服务消费者和提供者之间建立有状态的session会话。

4 加权轮询法

不同的后端服务器配置可能不一样,抗压能力不同,这样我们可以给配置高,负载低的更高权重,让其处理更多的请求。这样就可以将请求顺序地且按照权重分配到服务器

5 加权随机法

同理上面,但是他是去按照权重来随机选取服务器,而非顺序。

6 最小连接法

这个比较灵活,他是根据后台服务器当前的连接情况,动态选择当前积压连接数最少的一个服务器处理当前请求

1.3.3 动态配置规则

固定的策略无法满足需求,一方面要支持用户的特殊需求,一方面又要尽可能复用代码,所以将特殊的需求剥离出来,采用动态配置规则方式处理。

由于Groovy脚本语言能直接编译成Java的class字节码,很好的和Java进行交互,因此我们通过Groovy语言,利用其动态特性,实现负载均衡的动态配置。

1.3.4 ZooKeeper介绍和环境搭建

ZooKeeper是一个针对大型分布式系统的可靠的协调系统,提供的功能包括配置维护,名字服务,分布式同步,组服务等。ZooKeeper是可以集群复制的,集群间通过Zab协议保持数据的一致性。

该协议包括leader election和Atomic broadcas阶段,集群中将选出一个leader,其他的机器称为follower,所有的写操作都要被传到leader,并通过broadcas将所有的更新告诉follower。

当leader崩溃就会重新选出一个leader,让系统恢复正常。当leader被选举出来,且大多数服务器和leader完成数据同步后,leader election阶段就结束,进入Atomic broadcas阶段,主要是同步leader和follower之间的信息。

这里写图片描述

1.3.5 ZooKeeper API使用简介

这里会详细写一篇博客。

1.3.6 ZClient的使用

1.3.7 路由和负载均衡的实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_812630.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET网站发布到IIS后验证码不能显示与IIS模式

在VS2012上调试运行都正常&#xff0c;把网站部署到IIS后&#xff0c;登陆界面的验证码不能显示了&#xff08;验证码是通过另一个页面嵌入到登陆页面上的&#xff09;&#xff0c;在网上看到了好多解决方案&#xff0c;启用父路径&#xff0c;验证码的路径问题&#xff0c;登陆…

如何在电脑上测试手机网站(全)

最近公司要开发网站的移动版&#xff0c;让我准备准备知识&#xff0c;话说本人开发移动网站的经验还真不多&#xff0c;最悲剧的事情就是我的手机是个经典的诺基亚&#xff0c;而且公司还不给配手机&#xff0c;这是有多讨厌&#xff0c;没办法&#xff0c;没有手机只能用电脑…

基于WordPress搭建个人网站

文章目录阿里云服务器域名申请和备案安装Xshell和Xftp下载安装安装宝塔面板网站部署忘记密码欢迎来我的小站溜溜弯: life.yuweizhang.top 阿里云服务器 1.登录阿里云服务器官网&#xff0c;然后进行注册&#xff0c; 实名认证&#xff08;如果是学生可以进行学生认证&#xff…

lnmp如何设置二级域名并绑定网站

1. 解析二级域名 我用的是阿里云esc&#xff0c;直接找到域名解析这个页面&#xff0c;然后添加下你要解析的二级域名前面的字母&#xff0c;我的是music&#xff0c;这个可以根据自己的需求来起。 2. 测试二级域名是否成功解析 这个我们直接用万能的ping来测试一下就好了&…

卢松松:SEO 3.0其实早就不是新鲜事

何为SEO3.0? SEO1.0&#xff1a;是否有好的内容? SEO2.0&#xff1a;是否有较高的权重? SEO3.0&#xff1a;是否满足用户需求? 从去年开始陆续看到国内外的SEO专家在谈SEO 3.0&#xff0c;大多的意思都是指SEO以内容为基础去提供使用者最佳的使用经验&#xff0c;我们来…

中秋国庆长假,SEO你在坚持吗?

中秋国庆长假&#xff0c;举国同庆&#xff0c;无数人准备了丰富的游玩和放松计划&#xff0c;苦逼的SEO们&#xff0c;你们又在干嘛呢&#xff0c;在坚持自己的这份爱好么&#xff1f;还是和好多人一样&#xff0c;拼命的去挤下这拥堵的马路&#xff0c;上无数商家设下的购物陷…

SEO职业生涯规划的参考意见

步入SEO行业的人都有一个梦想&#xff0c;都是依靠SEO技术去赚钱。然而笔者观察了附件很多朋友&#xff0c;其中不乏有SEO界大牛人物&#xff0c;其已经利用SEO赚到了钱&#xff0c;也依靠SEO工作维持自己的生活&#xff1b;但也有一些SEO爱好者&#xff0c;他学过SEO&#xff…

中国联通网上营业厅,12306式的网站?

就在今日下午&#xff0c;笔者登陆联通网上营业厅办理套餐变更业务时&#xff0c;发现了下图一个“迷魂阵”似的矩阵&#xff0c;笔者顿时眩晕&#xff0c;不知道点击何处&#xff0c;作为读者的你们&#xff0c;你们看到下图觉得我办理66元A套餐该点击哪里? 于是我发了一条微…

公网ip访问服务器网站(博客)

本博客是关于如何用服务器的公网ip访问在服务器搭建好的网站&#xff0c;本人是在用xampp wordpress搭建博客时&#xff0c;用公网ip无法访问博客&#xff0c;在网上找了很多博客&#xff0c;试了很多方法&#xff0c;还是没有解决&#xff0c;最终无奈&#xff0c;只能想服务…

android混淆 网站,android混淆-关于依赖第三方库

之前写过关于打包混淆的一个帖子《android项目混淆打包注意事项》&#xff0c;它介绍的是对第三方jar包进行混淆&#xff0c;基本上可以解决混淆问题了。还不知道的&#xff0c;可以去看看&#xff0c;地址在这&#xff1a;http://my.eoe.cn/smile_it/archive/3820.html。现在的…

html5手机网站需要加的那些meta/link标签,html5 meta全解

一、大众机型常用meta标签name的设置 1、name之viewport <meta name"viewport" content""> 说明&#xff1a;屏幕的缩放 content的几个属性&#xff1a; width viewport的宽度[device-width | pixel_value]width如果直接设置pixel_value数值&a…

我国十大盗版网站:百度占前三

日前&#xff0c;国务院发展研究中心所属中国企业评价协会在北京召开新闻发布会&#xff0c;发布了《知识产权白皮书出版业》。“白皮书”中称&#xff0c;目前我国网络数字化盗版严重&#xff0c;搜索引擎成为盗版内容的重要出口&#xff0c;其中百度、百度贴吧和百度文库成为…

8 个接私活的网站

code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群2019互联网圈不好混&#xff0c;不是每个公司都能像腾讯云每人一部iPhone 11&#xff0c;不少公司今年已经没了年终奖&#xff0c;不要抱怨&#xff0c;因为有的小伙伴估计工作都没了。师长今天给大家推荐…

linq版本E-Commerce网站示例

在家把E-Commerce的代码换成了linq版本的,代码量少了很多,看来做的工作越来越少,程序员的工资又要跌了...代码不保证全部正确,只用于学习,需要的可以看看,运行环境当然是.net3.5了...值得注意的是,当表关系不存在一对一或多对多的时候,你还是需要手动创建实体.如购物车和产品两…

精选了国内外 6 个接私活的网站,供大家赚钱!

code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群本文来自公众号&#xff1a;GitHubDaily整理&#xff1a;起笔文章会向大家推荐国内外几个接外包比较靠谱的平台&#xff0c;主旨是贵精不贵多。因此&#xff0c;像「猪x戒」这种会让程序员自贬身价&#…

FineUI asp.net Web应用网站实例Demo

这是一个WEB应用平台的DEMO示例&#xff0c;基于C#的asp.net环境&#xff0c;选用FineUI为前端&#xff0c; 对后端SQLserver数据库的操控是使用微软的EntityFrameWork框架和面向对象的LINQ语法&#xff0c; 我使用这个平台组合已经有一段时间了&#xff0c;它经历了2次小的项…

做一个战役地图动态展示的网站

2019年末&#xff0c;无意间发现了一本2013年的架空历史军事穿越小说《晚明》&#xff0c;作者 柯山梦 。 故事背景发生在天启七年&#xff08;1627&#xff09;元月&#xff0c;走过259年的明王朝内忧外患&#xff0c;大乱将起。就在此时&#xff0c;一个脸皮极厚的办公室主任…

SAP APO 帮助的网站

https://help.sap.com/viewer/c95f1f0dcd9549628efa8d7d653da63e/7.0.4/en-US/cb09c4530b29b44ce10000000a174cb4.html

树莓派 + lnmp一键安装包 + thinkphp搭建网站

目录 前言&#xff1a; 一.准备树莓派 二.安装lnmp安装包 三.设置虚拟主机 1.添加虚拟主机​ 2.上传Thinkphp框架 3.进行一些配置&#xff08;重要&#xff09; 前言&#xff1a; 之前零星写了一些环境搭建的问题的解决方法&#xff0c;现在总结一下&#xff0c;把步骤…

中国万网官方网站被黑 黑客留言调侃

11月20日消息&#xff0c;有网友在a5论坛发帖反映&#xff0c;万网官方网站页面被黑&#xff0c;黑客在被黑页面上写出了 “吃饱没事做 做饱没事吃 中国鹰派有万涛 万涛黑站有绝招 打开机房推开门 拿起锤头往上敲 BY AK "等字样。 用户发帖反映万网官方网站被黑页面 万网官…