赞
踩
单一应用架构:网站流量小只需要一个应用,所有功能部署到一起
垂直应用架构:访问量逐渐增大,将应用拆分为几个互不相关的应用(无法重用公共模块)
分布式服务架构:应用之间必须交互,把核心业务抽取出来,作为独立的服务,使用分布式服务框架
流动计算框架:为了提高服务利用率,增加一个调度中心,实时管理集群,提高集群利用率
高性能,轻量级,开源javaRPC框架
Monitor(监控中心):监控服务提供者,服务消费者在内存调用的时间与次数,定时发送统计数据到监控中心
引入依赖(双方都有引入)
<!--dubbo主依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> <!--zookeeper客服端--> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <!--对zookeeper的包装依赖--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency>
服务端配置
<!--当前应用的名字 -->
<dubbo:application name="user-service"/>
<!--指定注册中心的地址 -->
<dubbo:registry address="zookeeper://8.131.68.141:9008" />
<!--使用dubbo协议,将服务暴露在20880端口 -->
<dubbo:protocol name="dubbo" port="20880" />
<bean class="service.UserServiceImpl" id="userService"/>
<!-- 指定需要暴露的服务 -->
<dubbo:service interface="service.UserService" ref="userService" />
客服端配置
<!--应用名称-->
<dubbo:application name="order-web"/>
<!-- 指定注册中心地址 -->
<dubbo:registry address="zookeeper://8.131.68.141:9008" />
<!-- 生成远程服务代理,可以和本地bean一样使用-->
<dubbo:reference id="userService" interface="service.UserService"/>
依赖(两端都一样,省略其他通用依赖)
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
服务端配置(调用端除了应用名称其他都一样)(所有属性都可以与xml属性对应)
dubbo.application.name=user-service
dubbo.registry.address=127.0.0.1:2181 # 注册地址
dubbo.registry.protocol=zookeeper # 注册类型
dubbo.protocol.name=dubbo # 协议类型
注解使用
使用@EnableDubbo开启Dubbo,两端都需要
使用com.alibaba.dubbo.config.annotation.Service注解标注服务提供
使用com.alibaba.dubbo.config.annotation.Reference标注对象来自远程调用
可以使用-Dxxx配置虚拟机参数,也可以使用xml,也可以使用配置文件(配置的命名规律如下图)
默认 虚拟机参数>xml配置>配置文件配置
dubbo.registry.check=false # 取消注册检测,默认注册失败会报错
dubbo.consumer.check=false # 取消服务检测,默认服务没有提供者会报错
dubbo.xxx.timeout=1000 # 设置各种超时时间,单位毫秒
dubbo.xxx.retries=2 # 调用超时,设置重试次数,设置为0不重试
dubbo.consumer.sticky=true # 指定粘性连接,用于有状态的连接,尽量让客服端总是向同一服务提供者发起调用,除非该服务提供者挂了才换,
对于幂等操作(查询,删除,修改)可以设置重试,非幂等操作(新增)不能设置重试
@Reference(version = “*”,cluster=“failfast”)//指定集群容错模式
failfast:调用一次出错直接报错,用于非幂等的写入操作
failsafe:调用出现异常直接忽略,用于写入日志操作
failback:失败自动恢复,后台记录失败请求定时重发
forking:并行调用多个服务,一个成功就返回,可以使用forks指定调用服务的数目,用于实时性较高的读操作
broadcast:广播所有服务提供者逐个调用任意一台报错就报错,用于通知服务提供者更新缓存
@Service(version = “1”)//指定服务版本 //注解都有很多参数
@Reference(version = “*”)//指定服务使用版本,可以使用统配符(在范围内随机)
编写代理
public class UserStub implements UserService {
private UserService userService;
// 代理必须实现对应的接口 构造器唯一参数 远程代理
public UserStub(UserService userService) {
this.userService = userService;
}
@Override
public User findUserById(Integer id) {
System.out.println("UserStub");//可以监听 调用 做其他操作
return userService.findUserById(id);
}
}
使用
// 指定代理 把 指定远程对象注入代理 每次执行 会调用代理
@Reference(version = "*",stub = "com.sk.hellouser.stub.UserStub")
private UserService userService;
@Configuration public class DubboConfig { // <dubbo:application name="user-service"/> @Bean public ApplicationConfig applicationConfig(){ ApplicationConfig config = new ApplicationConfig(); config.setName("user-service"); return config; } //<dubbo:registry address="zookeeper://8.131.68.141:9008" /> @Bean public RegistryConfig registryConfig(){ RegistryConfig config = new RegistryConfig(); config.setAddress("zookeeper://8.131.68.141:9008"); return config; } // <dubbo:protocol name="dubbo" port="20880" /> @Bean public ProtocolConfig protocolConfig(){ ProtocolConfig config = new ProtocolConfig(); config.setName("dubbo"); config.setPort(20080); return config; } //<dubbo:service interface="service.UserService" ref="userService" /> @Bean public ServiceConfig<UserService> serviceServiceConfig(UserService userService){ ServiceConfig<UserService> config = new ServiceConfig<>(); config.setInterface(UserService.class); config.setRef(userService); return config; } }
zookeeper注册中心宕机,服务消费者,仍能通过本地缓冲调用远程服务(zookeeper本地只是服务信息注册中心)
@Reference(url = “127.0.0.1:20882”)//也可以不通过注册中心 通过url直接连接
服务提供方配置 dubbo.protocol.port=20882
Random:随机,可以指定权重@Service(version = “1”,weight = 5)默认权重为0
RoundRobin:轮询,也可以指定权重,指定方式同上
LeastActive:按最近响应速度调用,最近响应越快调用概率越大
ConsistentHash:一致性Hash相同的请求,发到同一个对象处理
调用方法通过@Reference(loadbalance = “random”)指定负载均衡策略
@Reference(version = “*”,mock = “force”)//指定对服务降级
force:调用直接返回null,不发送远程调用
fail:还会远程调用,调用失败才返回null
@Reference(version = “*”,cache = “”)//指定对结果进行缓存
lru:使用lru算法进行缓存
threadlocal:线程缓存
每个远程对象都实现了EchoService接口 可以强制类型转换
调用Object ok = echoService.$echo(“OK”);进行回声测试,正常情况发什么,返回什么
RpcContext.getContext();//记录RPC远程调用的上下文信息,每次RPC调用都会改变
@Service(delay = 1000);//若服务需要初始化,可以指定延时暴露,单位毫秒,指定-1等待Spring容器准备完毕才暴露
@Service(token = “123456”);//设置服务的访问令牌,防止服务直连,必须通过服务中心获取令牌访问,若设置true,使用UUID随机生成
@Service(actives = 5);//actives设置最大并发数
ReferenceConfig用于创建远程服务映射,多次创建性能消耗较大,可以使用ReferenceConfigCache获取缓存(若缓存为null会自动创建)
ReferenceConfig<UserService> referenceConfig=new ReferenceConfig<>();
referenceConfig.setInterface(UserService.class);
ReferenceConfigCache configCache = ReferenceConfigCache.getCache();
UserService userService = configCache.get(referenceConfig);//获取缓存 获取不到才创建
configCache.destroy(referenceConfig);//销毁对应缓存
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
开启hystrix @EnableHystrix
注解使用
@HystrixCommand(fallbackMethod = "error")
@GetMapping("/getUser")
public User getUser(Integer id){
return userService.findUserById(id);
}
public User error(Integer id){
return null;
}
DubboBeanDefinitionParser实现了BeanDefinitionParser来对dubbo标签解析
DubboNamespaceHandler继承NamespaceHandlerSupport注册了相关的解析器
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。