========
-
命名服务 - 服务注册;服务自动发现
-
服务管理 - 服务状态监测;服务启动、停止;服务负载均衡
-
容错处理 - 实时屏蔽异常的服务,自动调配请求流量
-
流量分发 - 灰度发布、节点动态流量分配等场景
-
数据可视化 - 服务调用统计上报分析,提供清晰的数据图表展示,清晰了解服务间依赖关系
-
服务分组 - 支持服务动态自动归组与不同场景下的自定义分组,解决在多机房场景下跨机房调用穿透、Sandbox等问题
-
服务监控报警 - 支持服务与接口级别多指标、多维度的监控,支持多种报警方式
-
统一配置管理 - 支持服务配置统一管理,灵活设置不同环境间差异,支持历史版本,配置项变更后实时下发
-
分布式服务跟踪 - 轻松诊断服务访问慢、异常抖动等问题
-
过载保护 - 灵活定义服务消费者的配额,当其调用量超出最大阀值时,基于不同服务消费者进行QoS区分,触发过载保护。
-
服务访问控制
1.3 环境划分
========
服务提供者的环境分线上(IDC)和线下(办公云)两套系统,线下系统是对线上系统的模拟。 每套系统中都有 test/staging/prod 三个环境。
1.4 调用流程
========
-
各方(provider/consumer)在 OCTO 上注册自己专用的 appkey,比如 appkey-provider/appkey-consumer
-
provider 在 OCTO 上注册服务(标记为 appkey-provider),同一个 appkey 在三个环境中都有部署;
-
假设在 staging 环境 的 consumer 在 OCTO 上请求服务(标记自己 appkey-consumer,目标 appkey-provider)
-
OCTO 查询 staging 环境的 appkey-provider 的服务列表,并发送给 consumer
-
consumer 通过 mtthrift 访问 IP:PORT 服务
1.5 理解 appkey
=============
以 Nginx 为参照来理解。 对于传统的配置方式,域名与物理服务器的映射关系由 Ngnix 维护,物理服务器的增减需要运维人员调整,无法动态完成:
对于 appkey 的配置方式,新增了 appkey 一层:
-
域名与 appkey 的映射关系由 Nginx 配置,以后无需调整;
-
而 appkey 与物理服务器的映射关系,可以动态调整。
Thrift 同理,对于客户端请求(appkey:port),Thrift Server 通过 appkey 找到物理服务器(IP:port)。
2 整体架构
======
2.1 MTransport(服务通信框架)
======================
MTthrift 是基于 Thrift(由 Facebook 来源为 Apache Thrift )二次开发,是一个分布式服务通讯框架,致力于提供高性能和透明化的RPC远程服务调用方案,是 OCTO 服务治理方案的核心框架,每天为4000+服务提供2000亿+次访问量支持,被广泛应用于新美大各个业务线。
MTransport 是多语言的服务通信框架,它屏蔽了底层高性能网络通信的实现细节, 从而实现简单高效的服务开发。MTransport 支持 Thrift/HTTP/pigeon 等协议。其中 Thrift 包括 MTthrift(Java)、PThrift(PHP)、CThrift(C/C++)、Turbo Thrift(NodeJS)等,Thrift 支持不同语言版本的代码实现, 保持通信协议的一致性,支持服务注册、服务自动发现、分布式服务调用跟踪等。HTTP 目前也支持JAVA、NodeJs以及C++。
MTthrift 提供服务模板管理, 代码生成引擎等高效工具.
2.2 HLB(弹性负载均衡器)
================
HLB 是 Hardware Load Balance 的缩写。 所有HTTP请求/应答流量都会穿过这个系统,类似amazon elb。
2.3 SG_agent(服务治理代理)
=====================
SG 是 Service Governance 的缩写。 SG_agent 部署在各服务节点(服务的提供者和消费者),通过与MNS进行通信,提供服务注册/发现、配置更新、访问控制、配额限制等功能,并将调用统计上报给性能监控平台。
2.4 MNS(美团命名服务)
===============
MNS 是 Meituan Naming Service 的缩写。 MNS 是服务注册路由中心,基于 ZooKeeper 构建,为公司各类分布式服务提供稳健可靠的命名服务管理组件, 快速实现服务注册、路由、服务自动发现。
主要提供服务概要、节点IP/Port、节点权重、配额等信息的存储/访问,及服务健康状态检测等。
-
可靠性: (1)一致性:不论连接到集群的哪一台服务器节点,展示的都是一致的数据视图。 (2)原子性:节点的更新要么成功,要么失败。 (3)高可用性:在2n+1台机器组成的集群中,即使n台机器失败,仍不影响集群的高可用性。
-
去中心化:中心的MNS主要提供服务注册、发现、路由策略等功能,其他服务主要由在各服务节点的SG_agent提供。
2.5 Data-center(服务数据中心)
=======================
收集公司所有接入OCTO业务的上报日志数据,为各业务线提供系统的性能指标、健康状况、基础告警等
2.6 Scanner(健康检查系统)
===================
扫描各服务的健康状况,不可用时从 MNS 中剔除。
2.7 MCC(美团配置中心)
===============
MCC 是 Meituan Config Center 的缩写。 统一配置中心,提供统一配置管理服务, 实现配置与代码分离、配置信息实时更新、高可用性、版本控制, 提高服务开发效率,降低运维成本。 其原理是将 JSON 格式的配置文件存储在 ZooKeeper 目录下,当用户在 MSGP 更改配置时,由 MSGP 通知 SG_agent 进行数据拉取,将zk中的配置数据落地到本机的指定目录中。
2.8 MSGP(美团服务治理平台)
==================
MSGP 是 Meituan Service Governance PlatForm 的缩写。 目标:为公司各类服务提供注册、治理、诊断,配置,配额等功能的一站式管理平台。
3 接入方法
======
使用thrift 提供的@ThriftService、@ThriftMethod、@ThriftStruct、@ThriftField等注解,注解于普通的Java类,使其成为thrift的数据模型(model)和服务接口(service)。其使用模式与 Dubbo 非常相似:服务的提供者和消费者基于共同的一套接口定义。
下面基于 SpringBoot 创建
interface/provider/consumer 三个模块。 在本机上运行 provider,即可成功注册至 dev 环境的 OCTO 上。 在本机上运行 consumer,即可成功消费 provider 提供的服务。 本例已在美团内网跑通。
3.1 公用接口 service-interface
==========================
引入依赖包,并定义接口 DemoThriftService。 其中用到的参数 StudentParam / GenderEnum 必须用相关注解标注。
3.1.1 pom.xml
=============
com.meituan.service.mobile
mtthrift
1.8.5
com.meituan.mtrace
mtrace
1.1.14
3.1.2 StudentParam.java
=======================
/**
-
@author: kefeng.wang
-
@date: 2018-06-29 16:34
-
@description: 学生定义(作为输入参数)
**/
@ThriftStruct
public class StudentParam {
private Integer id;
private String name;
@ThriftConstructor
public StudentParam(Integer id, String name) {
this.id = id;
this.name = name;
}
@ThriftField
public Integer getId() {
return id;
}
@ThriftField(1)
public void setId(Integer id) {
this.id = id;
}
@ThriftField
public String getName() {
return name;
}
@ThriftField(2)
public void setName(String name) {
this.name = name;
}
}
3.1.3 GenderEnum.java
=====================
/**
-
@author: kefeng.wang
-
@date: 2018-06-29 16:41
-
@description: 性别定义(作为输出参数)
**/
@ThriftEnum
public enum GenderEnum {
GENDER_MALE(1, “male”, “男性”),
GENDER_FEMALE(2, “female”, “女性”),
GENDER_UNKNOWN(0, “unknown”, “未知性别”);
private Integer id;
private String value;
private String desc;
GenderEnum(Integer id, String value, String desc) {
this.id = id;
this.value = value;
this.desc = desc;
}
// @ThriftEnumValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
3.1.4 DemoThriftService.java
============================
/**
-
@author: kefeng.wang
-
@date: 2018-06-29 16:19
-
@description: Thrift 接口定义
**/
@ThriftService
public interface DemoThriftService {
@ThriftMethod
String getVersion() throws TException;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
Ending
Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下
如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)
吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下**
如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)
[外链图片转存中…(img-fbpJOdji-1712722552770)]
[外链图片转存中…(img-BN84jcnt-1712722552770)]
吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-4WcO5tFD-1712722552771)]