当系统功能太多时,随便改一下东西可能都影响到别的功能,启动一次动不动五六分钟,关键是有一些新的小伙伴加入你的时候,每个模块的功能他都要了解,否则一不小心就像拍仓鼠一样,一个bug改了,又冒出来一个。拆分吧,装个逼。拆成微服务。用户一个服务,图书的管理一个服务,拍卖一个服务,短信一个服务。每个服务由不同的人来负责,大家都对自己的业务比较熟悉,项目小而精致。但是拆分会面临以下很多问题:怎么拆分,如何划分颗粒度拆分后怎么协作下游服务频繁的失败怎么办怎么保证高可用怎么保证数据的一致性系统间怎么监控?(调用链路、日志、报警机制、)
链接:https://www.zhihu.com/question/265634331/answer/830026280
服务是什么:
操作系统中的服务是指执行指定系统功能的程序、例程或进程,以便支持其他程序,尤其是低层(接近硬件)程序。
通过网络提供服务时,服务可以在Active Directory(活动目录)中发布,从而促进了以服务为中心的管理和使用。服务是一种应用程序类型,它在后台运行。
服务应用程序通常可以在本地和通过网络为用户提供一些功能,例如客户端/服务器应用程序、Web服务器、数据库服务器以及其他基于服务器的应用程序。
服务间的通信:
https://youzhixueyuan.com/the-difference-between-restful-soap-rpc-soa-and-micro-service.html
1、restful
一种架构设计风格,提供设计原则和约束条件,而不是架构。满足这种条件的rest福利架构或者服务。
REST,即Representational State Transfer的缩写。我对这个词组的翻译是"表现层状态转化"。
https://www.jianshu.com/p/8b769356ee67
(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
动作:
GET (SELECT):从服务器检索特定资源,或资源列表。
POST (CREATE):在服务器上创建一个新的资源。
PUT (UPDATE):更新服务器上的资源,提供整个资源。
PATCH (UPDATE):更新服务器上的资源,仅提供更改的属性。
DELETE (DELETE):从服务器删除资源。
首先是四个半种动作:
post、delete、put/patch、get
因为put/patch只能算作一类,所以将patch归为半个。
状态码:
1xx 信息,请求收到,继续处理。范围保留用于底层HTTP的东西,你很可能永远也用不到。
2xx 成功,行为被成功地接受、理解和采纳
3xx 重定向,为了完成请求,必须进一步执行的动作
4xx 客户端错误,请求包含语法错误或者请求无法实现。范围保留用于响应客户端做出的错误,例如。他们提供不良数据或要求不存在的东西。这些请求应该是幂等的,而不是更改服务器的状态。
5xx 范围的状态码是保留给服务器端错误用的。这些错误常常是从底层的函数抛出来的,甚至
开发人员也通常没法处理,发送这类状态码的目的以确保客户端获得某种响应。
当收到5xx响应时,客户端不可能知道服务器的状态,所以这类状态码是要尽可能的避免。
2、SOAP
简单对象访问协议是一种数据交换协议规范,是一种轻量的、简单的、基于XML的协议的规范。SOAP协议和HTTP协议一样,都是底层的通信协议,只是请求包的格式不同而已,SOAP包是XML格式的。
3、RPC
RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)
RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)
RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。
4、SOA
SOA(Service-Oriented Architecture),中文全称:面向服务的架构。
通俗点来讲,SOA提倡将不同应用程序的业务功能封装成“服务”并宿主起来,通常以接口和契约的形式暴露并提供给外界应用访问(通过交换消息),达到不同系统可重用的目的。
SOA是一个组件模型,它能将不同的服务通过定义良好的接口和契约联系起来。服务是SOA的基石。
5、微服务和SOA的区别
微服务是SOA架构演进的结果。两者说到底都是对外提供接口的一种架构设计方式,随着互联网的发展,复杂的平台、业务的出现,导致SOA架构向更细粒度、更通过化程度发展,就成了所谓的微服务了。
四种微服务架构:
1、单一应用架构
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。
2、垂直应用架构
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
3、分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。
4、流动计算架构
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。
此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
dubbo简单demo
服务端server:
1、定义接口
package com.alibaba.hello.api;
public interface HelloService
{
String sayHello(String name);
}
2、接口的实现类:
package com.alibaba.hello.impl;
import com.alibaba.hello.api.HelloService;
public class HelloServiceImpl implements HelloService{
public String sayHello(String name){
return "Hello" + name;
}
}
3、spring配置(provider.xml)
把接口和接口实现类都配置一下
<?xmlversion="1.0"encoding="UTF-8"?>
<beans......>
<!--Applicationname-->
<dubbo:applicationname="hello-world-app"/>
<!--registryaddress,usedforservicetoregisteritself-->
<dubbo:registryaddress="multicast://224.5.6.7:1234"/>
<!--exposethisservicethroughdubboprotocol,throughport20880-->
<dubbo:protocolname="dubbo"port="20880"/>
<!--whichserviceinterfacedoweexpose?-->
<dubbo:serviceinterface="com.alibaba.hello.api.HelloService"ref="helloService"/>
<!--designateimplementation-->
<beanid="helloService"class="com.alibaba.hello.impl.HelloServiceImpl"/>
</beans>
4、测试代码
importorg.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider{
public static void main(String[] args){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(newString[]{"provider.xml"});
//启动成功,监听端口为20880System.in.read();//按任意键退出
}
}
二、客户端
1、Spring配置文件:(consumer.xml)
<?xmlversion="1.0"encoding="UTF-8"?>
<beans xmlns=......>
<!--consumerapplicationname-->
<dubbo:applicationname="consumer-of-helloworld-app"/>
<!--registryaddress,usedforconsumertodiscoverservices-->
<dubbo:registryaddress="multicast://224.5.6.7:1234"/>
<!--whichservicetoconsume?-->
<dubbo:referenceid="helloService"interface="com.alibaba.hello.api.HelloService"/>
</beans>
2、客户端测试代码(Consumer.java)
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.alibaba.hello.api.HelloService;
public class Consumer{
public static void main(String[] args){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(newString[]{"consumer.xml"});
HelloService helloService = (HelloService)context.getBean("helloService");
//getserviceinvocationproxyStringhello=helloService.sayHello("world");
//doinvoke!System.out.println(hello);
//cool,howareyou~
}
}
其中main函数调用可以采用spring的方式,也可以采用API的方式。
采用API方式调用时,有以下几个步骤:
1、注册中心实现,全局唯一
2、服务提供者连接注册中心,设置属性
3、得到调用代理后,请缓存下来保持单例
面向接口代理的高性能RPC调用
提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。
智能负载均衡
内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
服务自动注册与发现
支持多种注册中心服务,服务实例上下线实时感知。
高度可扩展能力
遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。
运行期流量调度
内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。
可视化的服务治理与运维
提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。