服务框架HSF分析之三Consumer启动和处理
来源:互联网 发布:mac怎么玩穿越火线 编辑:程序博客网 时间:2024/05/22 15:04
前两篇文章为大家带来了HSF容器启动和Porvider的分享。这篇来分析下consumer端的运行机制。
一. Consumer的启动
1. 服务代理
在HSFSpringConsumer的启动中会返回一个HSFServiceProxy的jdk动态代理,后续调用其实都是通过这个代理类来实现的。
- InvocationHandler handler = newHSFServiceProxy(metadata);
- Object proxyObj =Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] {interfaceClass }, handler);
InvocationHandler handler = newHSFServiceProxy(metadata); Object proxyObj =Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] {interfaceClass }, handler);
2. 服务订阅
通过metadataService的subscribe订阅服务的信息,主要是接口的所有地址,路由规则和机房流量规则
a. 路由规则
通过diamond订阅路由规则
- DiamondManager diamondManager = newDefaultDiamondManager(group, dataId, new ManagerListenerAdapter() {
- @Override
- public voidreceiveConfigInfo(String configInfo) {
- registerRule(serviceUniqueName, configInfo);
- }
- });
- .......
- registerRule(serviceUniqueName,configInfo);
DiamondManager diamondManager = newDefaultDiamondManager(group, dataId, new ManagerListenerAdapter() { @Override public voidreceiveConfigInfo(String configInfo) { registerRule(serviceUniqueName, configInfo); } }); ....... registerRule(serviceUniqueName,configInfo);
当consumer端会有定时线程去diamond端获取单个服务的配置信息,默认周期15s,同时diamond使用了pushit进行实时通知,当有变更时会实时拿到变更信息,当有规则变更时都会刷新本地规则。
b. 路由规则注册
主要分2部分,路由规则(机器路由),机房流量规则(是否本地机房优先)
b.1 路由规则注册
b.1.1规则解析
代码:
- // 处理路由规则
- if (splitter.has(HSFConstants.HEADER_ROUTING_RULE)) {
- final String routingRule =splitter.get(HSFConstants.HEADER_ROUTING_RULE);
- addressService.setServiceRouteRule(serviceUniqueName, routingRule);
- }
// 处理路由规则 if (splitter.has(HSFConstants.HEADER_ROUTING_RULE)) { final String routingRule =splitter.get(HSFConstants.HEADER_ROUTING_RULE); addressService.setServiceRouteRule(serviceUniqueName, routingRule); }
当在diamond里配置了路由规则时触发更新,规则内容类似于
- Groovy_v200907@package hqm.test.groovy
- public class RoutingRule{
- Map<String,List<String>> routingRuleMap(){
- return[
- "DETAIL":[
- "172.23.172.101:*",
- "172.24.165.63:*",
- "172.23.204.170:*",
- "172.23.204.185:*",
- ……
- ]
- ];
- }
- String interfaceRoutingRule(){
- return null;
- }
- String mathodRoutingRule(String methodName, String[] paramTypeStrs){
- return "DETAIL";
- }
- Object argsRoutingRule(String methodName, String[] paramTypeStrs){
- return null;
- }
- }
Groovy_v200907@package hqm.test.groovypublic class RoutingRule{ Map<String,List<String>> routingRuleMap(){ return[ "DETAIL":["172.23.172.101:*","172.24.165.63:*","172.23.204.170:*","172.23.204.185:*",……] ]; } String interfaceRoutingRule(){ return null; } String mathodRoutingRule(String methodName, String[] paramTypeStrs){ return "DETAIL"; } Object argsRoutingRule(String methodName, String[] paramTypeStrs){ return null; } }
在setServiceRouteRule中,hsf会调用parser来解析这些规则,上面那个规则将被GroovyRouteRuleParser解析成RouteRule实体,代码:
- RouteRule<String> rule = null;
- for (RouteRuleParser parser : this.ruleParsers) {
- ...
- rule =parser.parse(rawRouteRuleObj, allMethodSigs);
- ...
- }
RouteRule<String> rule = null; for (RouteRuleParser parser : this.ruleParsers) { ... rule =parser.parse(rawRouteRuleObj, allMethodSigs); ... }
具体parse过程:
1. 拿到Groovy的Classloader:GroovyClassLoader loader = newGroovyClassLoader(GroovyRouteRuleParser.class.getClassLoader());
2. 将规则加载成Class实例 c_groovy = loader.parseClass(groovyRule);
3. 反射生成实例 ruleObj = c_groovy.newInstance();
4. 反射调用routingRuleMap方法,拿到规则索引的Map,后续的类级,方法级规则等的处理都是基于这个规则索引的
5. 反射调用interfaceRoutingRule方法,拿到接口级别的规则名称
6. 反射调用mathodRoutingRule方法,拿到方法级别的规则名称
7. 反射调用argsRoutingRule方法,拿到参数级别的规则名称
8. 组装RouteRule实体对象,返回之
b.1.2 地址结果更新
规则实体解析之后,就需要对现有的地址进行更新了,这样就可以让配置在调用方起效。代码:
- RouteResultCache<String>addressCache = getRouteResultCache(serviceUniqueName);
- addressCache.setRouteRule(rule);
- addressCache.reset();
- 服务框架HSF分析之三Consumer启动和处理
- 分布式服务框架HSF
- HSF 入门-发布和调用hsf服务
- 分布式服务框架HSF学习
- 式服务框架HSF学习
- 分布式服务框架HSF学习 Dubbo VS HSF
- 本地jboss启动hsf服务及单元测试
- 关于HSF(高性能服务框架)方案的疑问
- OpenStack Swift源码分析(3)----swift服务启动源码分析之三
- 淘宝(taobao)HSF框架
- 淘宝(taobao)HSF框架
- 淘宝(taobao)HSF框架
- HSF的原理分析
- Openstack学习笔记之——Neutron-server服务加载与启动源码分析(三)
- hsf服务的调用过程
- Android服务启动之StartService源码分析
- Android服务之PackageManagerService启动源码分析
- Android服务之PackageManagerService启动源码分析
- JAVA经典算法40题(10)
- java中多维数组探讨及发散思考
- 和我一起学 Selenium WebDriver(4)——基础篇
- JCodeModel定义生成代码中的泛型变量
- JDBC DB TableName
- 服务框架HSF分析之三Consumer启动和处理
- jsp页面取struts2 action的变量供java、servlet使用
- Java标签分页实现
- 浏览器图片验证码
- [转载]java命令执行jar包的方式
- Ant build.xml的创建(一)
- 编程之美读书笔记(5)最大公约数
- 哈希表,开放地址法之再哈希代码(JAVA)
- Java Hex 16进制的 byte String 转换类