赞
踩
集群:很多"人"一起干活,干一样的事
分布式:很多"人"一起,干不一样的事。这些不一样的事,合起来是一件大事。
高性能、高可用、可扩展、可伸缩
RPC:Remote Proceduce Call 远程过程调用。有很多的协议和技术来都是实现了RPC的过程。比如HTTP REST风格,Java RMI规范、WebService SOAP、Hession等等。
垂直架构
分布式架构存在的问题:
特点:
SOA:(Service-Oriented Architecture),面向服务的架构是一个组件模型,它将应用程序的不同功能单元(服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来。
微服务架构区别于传统的单体软件架构,是一种为了适应当前互联网后台服务的
特点:
dubbo 是一款高性能、轻量级的开源Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,只能容错和负载均衡,以及服务自动注册和发现。
服务提供者(Provider): 暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需要的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
监控中心(Monitor): 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中.
支持多种协议: dubbo、hessian、rmi、http、webservice、thrift、memcached、redis.
dubbo官方推荐使用的是dubbo 协议。dubbo 协议默认端口是20880。
使用dubbo 协议,spring 配置文件加入:
<dubbo:protocol name="dubbo" port="20880"/>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--声明dubbo服务使用提供的名称:保证唯一性--> <dubbo:application name="dubbo004-privider"/> <!--设置dubbo使用的协议和端口号--> <dubbo:protocol name="dubbo" port="20880"/> <!--zookeeper注册中心的地址,指定注册中心地址和端口号--> <dubbo:registry address="zookeeper://localhost:2181" port="20880"/> <!--暴露服务接口--> <dubbo:service interface="com.mk.dubbo.service.UserService" ref="userService"/> <!--加载业务接口的实现类到spring容器中--> <bean id="userService" class="com.mk.dubbo.service.UserServiceImpl"/> </beans>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- Spring配置文件信息 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/config/dubbo-userservice-provider.xml</param-value>
</context-param>
<!-- ContextLoaderListener监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.7</version> </dependency> <!--引入接口工程--> <dependency> <groupId>org.example</groupId> <artifactId>dubbo003-interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--注册中心--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.1.0</version> </dependency>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--服务的提供者必须声明名称,并且必须保证服务名称的唯一性,它的名称是dubbo内部使用的唯一标识--> <dubbo:application name="dubbo005-consumer"/> <!--指定注册中心--> <!--使用linux的注册中心--> <!--<dubbo:registry address="zookeeper://localhost:2181"/>--> <dubbo:registry address="zookeeper://localhost:192.168.154.128:2181"/> <!--引用远程接口服务--> <dubbo:reference id="userService" interface="com.mk.dubbo.service.UserService" url="dubbo://localhost:20880"/> </beans>
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/userDetail")
public String userDetail(Model model, Integer id,String username){
//根据用户标识获取用户详情
User user = userService.queryUserById(id,username);
model.addAttribute("user", user);
return "userDetail";
}
}
测试结果:
对于服务的提供方,它需要发布服务,而且由于应用系统的复杂性,服务数量、类型也不断膨胀;对于服务方消费方
dubbo支持的注册中心是:
Multicast 注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现。
Zookeeper 是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用
Nacos 是最近由 Alibaba 推出快速实现动态服务发现、服务配置、服务元数据及流量管理、多租户的开源项目。同时支持注册中心、配置中心分离和合并部署。
基于 Redis 实现的注册中心,使用 Redis 的 Key/Map 结构存储数据结构,使用 Redis 的 Publish/Subscribe 事件通知数据变更。
Simple 注册中心本身就是一个普通的 Dubbo 服务,可以减少第三方依赖,使整体通讯方式一致。
首先进入apache官网
Linux下的安装与windows类似
dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring 初始化完成,以便上线时,能及早发现问题,默认check=true。通过check="false"关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
由于网络或服务端不可靠,会导致调用出现一种不确定的中间状态(超时).为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间
timeout:调用远程服务超时时间(毫秒)
每个接口都应定义版本号,为后续不兼容升级提供可能。当一个接口有不同的实现,项目早期使用的一个实现类,之后创建接口的新的实现类。区分不同的接口实现使用version。
线时,能及早发现问题,默认check=true。通过check="false"关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
由于网络或服务端不可靠,会导致调用出现一种不确定的中间状态(超时).为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间
timeout:调用远程服务超时时间(毫秒)
每个接口都应定义版本号,为后续不兼容升级提供可能。当一个接口有不同的实现,项目早期使用的一个实现类,之后创建接口的新的实现类。区分不同的接口实现使用version。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。