Normandy搭建手册

简介:
1、源代码
normandy.shared.trunk:  svn co http://svn.alibaba-inc.com/repos/ali_platform/normandy/shared/trunk
normandy.server:  svn co http://svn.alibaba-inc.com/repos/ali_platform/normandy/app/server/trunk/normandy.server
2、数据库
  10.20.36.26开发库 10.20.129.167测试库 normandy/normandy,Schema:normandy_dev/normandy_test
对用户授权:
GRANT ALL PRIVILEGES ON *.* TO 'normandy'@'localhost' IDENTIFIED BY 'normandy' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'normandy'@'%' IDENTIFIED BY 'normandy' WITH GRANT OPTION;
 
3、编译以及环境搭建
<1> 先编译normandy.shared.trun, 再编译normandy.server, 最后在normandy.server/target/normandy.server-0.1.0/bin下面使用./start-normandy.sh进行启动。 
<2>以debug的方式启动程序
./ start-normandy.sh debug
debug启动端口 normandy.server.debug.port              = 9020
<3>以Debug方式远程调试程序
首先:必须使用debug参数开启debug端口9020
其次:在入口server的ConfigServiceImpl类的方法上面设置断点, 远程连接服务器
最后,在程序中以java或者debug方式启动客户端(即客户端是否需要开启debug模式,与服务器是否是debug模式没关系;同样服务端是否开启debug与客户端是否开启也没关系),则此时会在设置断点的地方停止下来等待继续。
断开远程端口:在eclipse的debug视图下面,点击类时出现红色的‘Terminal’按钮即可。
 
4、提供的服务
 
 
5、架构分析
 
6、业务
 
【注意】
1、注意数据的正确性
config_key, config_value
2、对Transaction进行事务各种管理,方便测试
首先:添加依赖管理
 
  1. <dependency> 
  2.         <groupId>com.alibaba.external</groupId> 
  3.         <artifactId>sourceforge.spring.modules.aspects</artifactId> 
  4.         <version>2.5.6</version> 
  5. </dependency> 
其次:增加切面方法
 
  1. package com.alibaba.normandy.server.core.service.util; 
  2.  
  3. import org.aspectj.lang.ProceedingJoinPoint; 
  4. import org.aspectj.lang.annotation.After; 
  5. import org.aspectj.lang.annotation.AfterThrowing; 
  6. import org.aspectj.lang.annotation.Around; 
  7. import org.aspectj.lang.annotation.Aspect; 
  8. import org.aspectj.lang.annotation.Before; 
  9. import org.aspectj.lang.annotation.Pointcut; 
  10.  
  11. @Aspect 
  12. public class TransactionInjectionServiceUtil { 
  13.      
  14.     @Pointcut("execution(public * com.alibaba.normandy.server.core.service.impl.*.*(..))"
  15.     private void pointcutService(){ 
  16.     } 
  17.      
  18.     @Pointcut("execution(public * com.alibaba.normandy.server.core.service.dao.*.*(..))"
  19.     private void pointcutDao(){ 
  20.     } 
  21.      
  22.     @Before("pointcutService()"
  23.     public void beforeServiceActions(){ 
  24.         //before action 
  25.         System.out.println("beforeServiceActions invoked!"); 
  26.          
  27.     } 
  28.     @After("pointcutService()"
  29.     public void afterServiceActions(){ 
  30.         //after action 
  31.         System.out.println("afterServiceActions invoked!");  
  32.     } 
  33.     @Around("pointcutService()"
  34.     public void aroundServiceActions(ProceedingJoinPoint pjp){ 
  35.         //before action 
  36.         System.out.println("before aroundServiceActions invoked!");  
  37.          
  38.         try { 
  39.             pjp.proceed(); 
  40.         } catch (Throwable e) { 
  41.             e.printStackTrace(); 
  42.         } 
  43.          
  44.         //after action 
  45.         System.out.println("after aroundServiceActions invoked!");  
  46.     } 
  47.      
  48.     @AfterThrowing("pointcutService()"
  49.     public void exceptionServiceActions(){ 
  50.         System.out.println("exceptionServiceActions invoked!");  
  51.         throw new RuntimeException("exception in service, will rollback!"); 
  52.     } 
增加配置文件:normandy-transactionService-aop.xml,在配置文件中添加如下配置
 
  1. <aop:aspectj-autoproxy /> 
  2. <bean id="transactionInjectionServiceUtil" class="com.alibaba.normandy.server.core.service.util.TransactionInjectionServiceUtil" /> 
在整个容器的加载地方指定要加载normandy-transactionService-aop.xml配置文件。在applicationContext-normandy-server.xml中进行添加:
 
  1. <import resource="classpath:spring/normandy-transactionService-aop.xml" /> 
 
最后:启动server服务器端,再开始远程调用
3、在pub时,必须要先创建application和domain的记录
例如:minas@us-domain:alibaba.platform.minas.basic.setting.workdir, 其中application为:minas, domain为:us-domain, 后面为真正的key值。 每次发布时,整个长度限制在255个字符之内,一般情况下是以'.'进行分割,也可以支持'_'。
4、定点推送
在发布的时候可以先考虑定点推送一个k/v给某台机器的某个端口进行验证,如果成功则可以大规模的推送到整个集群中。使用方法如下: 
String addressList = "10.20.30.40:8080"; client.publish(key, value,  addressList);
(1)定点发布只修改config_value_change_event表,而不修改config_key和config_value表。
(2)其中的fired_server_ip字段记录了normandy集群中完成publish机器的server的ip地址。
 
5、发布保证最终的一致性
pub的的key/value键值对,会保证最终的一致性,但是需要处理经历事件的过程,正常情况在5秒之内完成。所以意味着:马上发的,马上去订阅可能订阅不了。
6、在多个client同时不断发布同一个Key,不同的value时,可能存在异常:com.alibaba.normandy.server.core.service.exception.ConcurrentConflictException:
这是由于获取了version之后都做插入的动作。服务器不应该去决定服务器是否重试,而是应该为客户端抛出异常,由客户端来做处理。
7、数据库设计
select APPLICATION_ID, DOMAIN_ID,  uid,AGGREGATE_TYPE,enabled,  globe_uid from config_key;
select CONFIG_KEY_ID, value,type,VERSION,publisher from config_value;
application:关于应用的内容,例如dubbo、napoli
domain:关于域的内容,例如:杭州域 hz-domain或者美国域 us-domain
normandy_server:关于normandy server自身的相关信息,其中 status的含义为: 1表示normandy server为stop,2表示normandy server为start,3为overlapped,但是3不会写到数据库。
8、normandy server允许连接数设置
 
在配置文件normandy-server-core-services.xml中有参数${connection.maxConnectionCount}
在antx.properties中,通过normandy.server.connection.max.count进行传递
 
 
9、多线程下面publish场景,出现java.util.ConcurrentModificationException
非append接口,直接抛给客户端
如果是append接口,server负责重试到成功为止
10、由于publish和publishAppend的语义的区别,所以不允许放在一起针对同一个key进行使用。
publish:config_value的type字段为 com.alibaba.normandy.common.domain.SimpleConfigValue,publisher值为 发布者ip:端口
publishAppend:config_value的type字段为 com.alibaba.normandy.common.domain.CombinedConfigValue,publisher值为 serverip:端口- 发布者ip:端口+uid
 11、联合查询
查询application、domain、key、value: select a.name, d.name, uid, value , version  from domain d, application a, config_key k, config_value v where k.id = v.CONFIG_KEY_ID;
select a.name, d.name, uid, value, version from domain d, application a, config_key k, config_value v where k.id = v.CONFIG_KEY_ID;
12、normandy的key、value长度限制:2011-06-23
(1)调整key长度范围为255,而不是256
(2)config_key表的uid长度为200(key去除domain、application、@、:后剩下的部分),存在问题,需要修改为255
(3)value设置较大时,例如长度为2048时,则触发了dubbo的重连,存在并发修改异常;或者触发ProtocolClientException
 

本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/561642,如需转载请自行联系原作者
相关文章
|
存储 运维 监控
双11黑科技,阿里百万级服务器自动化运维系统StarAgent揭秘
还记得那些年我们半夜爬起来重启服务器的黑暗历史吗?双11期间,阿里巴巴百万量级主机管理能安全、稳定、高效,如丝般顺滑是如何做到的?阿里巴巴运维中台技术专家宋意,首次直播揭秘阿里IT运维的基础设施StarAgent,详细分析StarAgent是如何支持百万级规模服务器管控?如何像生活中的水电煤一样,做...
18655 16
|
运维 大数据 Devops
研发管理难题如何破?云效打造强有力的阿里技术中台
云效(内部叫Aone)就是阿里的2万多名工程师和几万名员工协作沟通的工具,为了产品研发提供一个标准化的平台,覆盖从研发,到发布,再到日常运维的一站式平台,能够让开发同学通过这个平台,低成本的按照统一的流程进行研发活动,减少错误,提高效率。
5572 1
|
机器学习/深度学习 人工智能 算法
顶会论文 | 阿里云视频摘要 SOTA 模型:用于视频摘要的多层时空网络
这次向大家分享的工作是作者所负责团队在国际人工智能多媒体顶会 ACM MM 2022 (CCF-A)发表的文章 “Multi-Level Spatiotemporal Network for Video Summarization”,该文提出了一种用于视频摘要的多层时空网络,在视频摘要领域实现了全球领先的研究探索。基于作者团队在工业级推荐系统方面的研究积累,成功地在阿里云产业大规模视频摘要场景实践中解决了一个视频摘要领域的重要问题,推动了该领域的发展。
3974 1
顶会论文 | 阿里云视频摘要 SOTA 模型:用于视频摘要的多层时空网络
|
4月前
|
人工智能 自然语言处理 运维
企业如何应用智能客服:2026年瓴羊 Quick Service 实践全景
瓴羊Quick Service是阿里云推出的智能客服解决方案,依托通义千问大模型与行业小模型双驱动,AI问答准确率达93%,问题解决最快5秒,降本40%、提效3倍。支持多模态交互、动态知识图谱、情绪感知及全渠道无缝服务,已落地零售、汽车、物流等多行业。(239字)
|
IDE 开发工具 Python
lingma IDE无法使用很多微软官方插件,代码无法点击跳转
当前环境存在以下问题:1. 无法使用微软官方插件 IntelliCode,影响代码智能补全与开发效率;2. 代码中变量点击后无法跳转定义位置(如图所示,Python导入模块无法跳转),此为重大缺陷,请尽快修复,以提升开发体验。这些问题导致的功能缺失,使当前环境与理想开发需求存在一定差距。
1090 2
|
机器学习/深度学习 运维 监控
无人值守时代,运维如何保障发布质量?
阿里巴巴千亿交易背后,如何尽量避免发布故障?在面对实际运维过程中遇到的问题该如何解决?阿里巴巴运维技术专家少荃,给我们带来了解决方案和思路。
5700 0
|
存储 关系型数据库 MySQL
【阿里规约】阿里开发手册解读——数据库和ORM篇
从命名规范、建表规范、查询规范、索引规范、操作规范等角度出发,详细阐述MySQL数据库使用过程中所需要遵循的各种规范。
【阿里规约】阿里开发手册解读——数据库和ORM篇
|
Kubernetes 架构师 Java
史上最全对照表:大厂P6/P7/P8 职业技能 薪资水平 成长路线
40岁老架构师尼恩,专注于帮助读者提升技术能力和职业发展。其读者群中,多位成员成功获得知名互联网企业的面试机会。尼恩不仅提供系统化的面试准备指导,还特别针对谈薪酬环节给予专业建议,助力求职者在与HR谈判时更加自信。此外,尼恩还分享了阿里巴巴的职级体系,作为行业内广泛认可的标准,帮助读者更好地理解各职级的要求和发展路径。通过尼恩的技术圣经系列PDF,如《尼恩Java面试宝典》等,读者可以进一步提升自身技术实力,应对职场挑战。关注“技术自由圈”公众号,获取更多资源。
|
存储 缓存 负载均衡
图解一致性哈希算法,看这一篇就够了!
近段时间一直在总结分布式系统架构常见的算法。前面我们介绍过布隆过滤器算法。接下来介绍一个非常重要、也非常实用的算法:一致性哈希算法。通过介绍一致性哈希算法的原理并给出了一种实现和实际运用的案例,带大家真正理解一致性哈希算法。
30262 66
图解一致性哈希算法,看这一篇就够了!
|
存储 缓存 运维
阿里巴巴鹰眼系统简介
微服务框架带来的好处十分多,比如说它提高了开发的效率,它具备更好的扩展性。可是微服务其实是一把双刃剑,微服务同时也带来了一些问题,比如:
6409 0
阿里巴巴鹰眼系统简介