服务搭建
1、将公共的bean和服务借口放到一个工程模块里面
2、每个服务的提供者和消费者引入这个公共的服务模块
使用
1、将服务提供者注册到注册中心(暴露服务)
1)引入dubbo jar包
2)注册中心使用的是zookeeper,引入操作zookeeper的客户端(dubbo2.6版本之前的引入zookeeper客户端是zkcli,但dubbo2.6版本之后引入的zookeeper客户端是curator-frameword)
3)配置服务提供者
1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名)一般使用该服务的工程名即可
<dubbo:application name="user-service-provider"></dubbo:application>
2、指定注册中心的位置
两种写法
<!-- <dubbo:registry address="zookeeper://127.0.0.1"></dubbo:registry>-->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
3、指定通信规则(通信协议,通信端口)
<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
4、暴漏服务 ref:指向服务的真正的实现对象
<dubbo:service interface="com.jason.service.UserService" ref="userServiceImpl"></dubbo:service>
<!--服务的实现-->
<bean id="userServiceImpl" class="com.jason.service.impl.UserServiceImpl"></bean>
<dubbo:monitor protocol="registry"></dubbo:monitor>
2、让服务消费者去注册中心订阅服务提供者的服务地址
1)同样引入dubbo和zookeeper(curator)客户端jar包
消费者的全局配置,没有服务提供者时不检查,不报错
<dubbo:consumer check="false"></dubbo:consumer>
1、指定当前应用的名字
<dubbo:application name="order-service-consumer"></dubbo:application>
2、指定注册中心的位置
<dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
3、声明远程需要调用的接口,生成远程服务代理 check ="false"启动时不检查
<dubbo:reference interface="com.jason.service.UserService" id="userService" check ="false"></dubbo:reference>
4、注册监控中心
自动到注册中心中发现
<dubbo:monitor protocol="registry"></dubbo:monitor>
或者
<dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor>
spring boot整合dubbo
1、导入dubbo-spring-boot-starter
2、在配置文件中配置信息和上面使用spring一样
服务提供者
例如
dubbo.application.name=user-service-provider
dubbo.registry.address=127.0.0.1:2181
dubbo.registry.protocol=zookeeper
其他的都是同样的,就不再一一写
暴露服务使用注解方式
在服务实现类上面使用dubbo的 @service.为了防止与spring的冲突,可以将spring的写成@compenent
开启注解功能在启动配置类上加上 @EnableDubbo
服务消费者
服务消费者中也使用注解,即在服务上面使用注解@Reference,而不要使用@Autowired
@Reference
UserService userService;
开启注解功能在启动配置类上加上 @EnableDubbo
dubbo属性加载顺序 -d xml properties,
若虚拟机中配置则优先使用,然后才xml,最后proPerties
不同粒度配置的覆盖关系
以 timeout 为例,下图显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似:
方法级优先,接口级次之,全局配置再次之。
如果级别一样,则消费方优先,提供方次之。
check:检查
timeout:超时
retries:重试次数,不包含第一次调用,0代表不重试
幂等(设置重试次数):查询、删除、修改
非幂等(不能设置重试次数):新增
version:版本控制,*为随机调用,指定特定版本1.0.0,就会调用特定版本
本地存根
stub属性
<dubbo:reference interface="com.jason.service.UserService" id="userService" check ="false" stub="消费者的实现类"></dubbo:reference>
消费者的实现类一般写在公共模块工程里面,其实相当于默认实现类
spring boot第二种整合
保留xml文件,使用注解@ImportResource(locations=“classpath:provider.xml”),
不要再使用@EnableDubbo, 使用xml精确到方法的配置使用
spring boot第三种整合方式
使用api注解方式
也就是使用配置类,在配置类中将所有的xml中的配置都使用代码的方式加入到配置中,使用@Bean
此方式使用@EnableDubbo(scan…扫描包)
举例:
@Bean
public ServiceConfig<UserService> userserviceConfig(UserService userService){
ServiceConfig<UserService> serviceConfig = new ServiceConfig<>();
serviceConfig.serInterface(UserService.class);
serviceConfig.setRef(userService);
serviceConfig.setVersion(1.0.0);
//配置每一个method的信息
MethodConfig methodConfig= new MenthodConfig();
methodConfig.setName("getUserAddressList");
methodConfig.setTimeout(1000);
List<MethodConfig> methods = new ArrayList<>();
methods.add(methodConfig);
//将method关联到service中
serviceConfig.setMethods(methods);
}
高可用
zookeeper宕机与dubbo直连
现象:zookeeper注册中宕机,还可以消费dubbo暴露的服务。
注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
不需要注册中心时,直连方式;消费端采用直连
//(url="127.0.0.1:20882")有注册中心时要去掉
@Reference(url="127.0.0.1:20882")
UserService userService;
面试会问,zookeeper宕机,还可以访问服务吗,答案是肯定的,因为可以使用本地缓存方式,还可以访问提供者。
如不采用注册中心,则dubbo采用直连方式直接访问提供者
负载均衡机制:
random LoadBalance:基于权重的随机负载均衡机制,dubbot默认的负载均衡机制。
roundRobin LoadBalance:基于权重的轮询负载均衡机制:2:4:1
先按照顺序访问,再按照权重分配
LeastActive LoadBalance:最少活跃数-负载均衡机制
总会先找到上次访问最少的时间的服务器,挑选一个最快的服务器
ConsistentHash LoadBalance: 一致性hash-负载均衡机制
同一个访问地址都会访问同一台机器里面
服务降级
当服务器压力剧增的情况下,根据实际业务情况以及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
dubbo有2种降级机制
mock=force:return+null表示消费者对该服务的方法调用都直接返回null,不发起远程调用,用来屏蔽不重要服务不可用时对调用方的影响。
还可以改为 mock=fail:return+null,表示消费方对该服务的方法调用在失败后,再返回null值,不抛出异常,用来容忍不重要服务不稳定时对调用方的影响
集群容错
使用hystrix
1/导入hystrix jar包,
2/开启容错,@EnableHystrix
3/方法上使用 @HystrixCommand
消费者方法上使用 @HystrixCommand(fallbackMethod=“出错回调方法名”)
@HystrixCommand(fallbackMethod=“hello”)
public String userList(){
....
}
public String hello(){
....
}