写点什么

完整微服务化示例:使用 Apache ServiceComb 进行微服务开发、容器化、弹性伸缩(三)

  • 2019-12-25
  • 本文字数:2427 字

    阅读完需:约 8 分钟

完整微服务化示例:使用 Apache ServiceComb 进行微服务开发、容器化、弹性伸缩(三)

养蜂人 (Beekeeper)

养蜂人研究蜜蜂繁殖规律,计算每只蜜蜂 (雄蜂/雌蜂) 的祖先数量。因为蜜蜂繁殖规律和黄金分割数列相关,所以养蜂人同时消费技工提供的计算服务。


研究(http://www.dave-cushman.net/bee/fibonacci.html)表明,雄蜂(Drone)由未受精卵孵化而生,只有母亲;而雌蜂(Queen)由受精卵孵化而生,既有母又有父。



Credit: Dave Cushman’s website


参考上图,蜜蜂的某一代祖先数量符合黄金分割数列的模型,由此我们可以很快实现服务功能。

蜜蜂繁殖规律研究服务

首先我们定义黄金数列运算接口:


public interface FibonacciCalculator {  long term(int n);}
复制代码


接下来定义并实现蜜蜂繁殖规律研究服务:


interface BeekeeperService {  long ancestorsOfDroneAt(int generation);
long ancestorsOfQueenAt(int generation);}
class BeekeeperServiceImpl implements BeekeeperService {
private final FibonacciCalculator fibonacciCalculator;
BeekeeperServiceImpl(FibonacciCalculator fibonacciCalculator) { this.fibonacciCalculator = fibonacciCalculator; }
@Override public long ancestorsOfDroneAt(int generation) { if (generation <= 0) { return 0; } return fibonacciCalculator.term(generation + 1); }
@Override public long ancestorsOfQueenAt(int generation) { if (generation <= 0) { return 0; } return fibonacciCalculator.term(generation + 2); }}
复制代码


这里我们用到之前定义的 FibonacciCalculator 接口,并希望通过这个接口远程调用技工服务端点。@RpcReference 注释能帮助我们自动从 Service Center 中获取 microserviceName = “worker”, schemaId = “fibonacciRpcEndpoint” , 即服务名为 worker 已经 schema ID 为 fibonacciRpcEndpoint 的端点:



@Configurationclass BeekeeperConfig {
@RpcReference(microserviceName = "worker", schemaId = "fibonacciRpcEndpoint") private FibonacciCalculator fibonacciCalculator;
@Bean BeekeeperService beekeeperService() { return new BeekeeperServiceImpl(fibonacciCalculator); }}
复制代码


我们在技工一节已定义好对应的服务名和 schema ID 端点,通过上面的配置,ServiceComb 会自动将远程技工服务 实例和 FibonacciCalculator 绑定在一起。

养蜂人服务端点

与上一节技工服务相似,我们在这里也需要提供养蜂人服务端点,让用户可以进行调用:



@RestSchema(schemaId = "beekeeperRestEndpoint")@RequestMapping("/rest")@Controllerpublic class BeekeeperController {
private static final Logger logger = LoggerFactory.getLogger(BeekeeperController.class);
private final BeekeeperService beekeeperService;
@Autowired BeekeeperController(BeekeeperService beekeeperService) { this.beekeeperService = beekeeperService; }
@RequestMapping(value = "/drone/ancestors/{generation}", method = GET, produces = APPLICATION_JSON_UTF8_VALUE) @ResponseBody public Ancestor ancestorsOfDrone(@PathVariable int generation) { logger.info( "Received request to find the number of ancestors of drone at generation {}", generation);
return new Ancestor(beekeeperService.ancestorsOfDroneAt(generation)); }
@RequestMapping(value = "/queen/ancestors/{generation}", method = GET, produces = APPLICATION_JSON_UTF8_VALUE) @ResponseBody public Ancestor ancestorsOfQueen(@PathVariable int generation) { logger.info( "Received request to find the number of ancestors of queen at generation {}", generation);
return new Ancestor(beekeeperService.ancestorsOfQueenAt(generation)); }}
class Ancestor { private long ancestors;
Ancestor() { }
Ancestor(long ancestors) { this.ancestors = ancestors; }
public long getAncestors() { return ancestors; }}

复制代码


因为养蜂人需要消费技工提供的服务,所以其 microservice.yaml 配置稍有不同:


# all interconnected microservices must belong to an application wth the same IDAPPLICATION_ID: companyservice_description:# name of the declaring microservice  name: beekeeper  version: 0.0.1cse:  service:    registry:      address: http://sc.servicecomb.io:30100  rest:    address: 0.0.0.0:8090  handler:    chain:      Consumer:        default: bizkeeper-consumer,loadbalance  references:#  this one below must refer to the microservice name it communicates with    worker:      version-rule: 0.0.1

复制代码


这里我们需要定义 cse.references.worker.version-rule ,让配置名称中指向技工服务名 worker ,并匹配其版本号。


最后定义养蜂人服务应用入口:


@SpringBootApplication@EnableServiceCombpublic class BeekeeperApplication {
public static void main(String[] args) { SpringApplication.run(BeekeeperApplication.class, args); }}
复制代码


本文转载自微服务蜂巢公众号。


原文链接:https://mp.weixin.qq.com/s?__biz=MzUxNTEwNTg5Mg==&mid=2247488670&idx=1&sn=7556990599cea8e0fd80ed54b9f39026&chksm=f9bae195cecd688332940d0b296909e8130d828104c36c20f49d76d43561f626eae24bd0c1ef&scene=0&xtrack=1&key=17fbc717c1803f309d535a4bdbc0f9c0d8d2089a5c7e455df8c0a5e6d824a6534b8476d2ad151cd45ed10eb7a15577914596444e867d96f615c277fc05fe951cef48de8b7d0732dcb4bc74f5c0e2f95a&ascene=14&uin=MTI5MjAyNjcyMQ%3D%3D&devicetype=Windows+10&version=62070158&lang=zh_CN&exportkey=AfH3CzqE%2F1ENttvg815y9Uo%3D&pass_ticket=oGcazNeaRfkuszcDU0L7jpfeTFZ3%2FULBAbPnhurUkiyW7DLvBVsoC%2Fh5OWX1zIsH


2019-12-25 18:10807

评论

发布
暂无评论
发现更多内容

首场“说透数字化转型专题讲座”将于 9 月 15 日在天津举办

InfoQ 天津

亚信科技AntDB数据库国产化进程加速,计费上云再下一城

亚信AntDB数据库

实践案例 9月日更

会员业务基于Cloud KMS的数据安全应用

爱奇艺技术产品团队

数据安全法 Cloud KMS

iOS 屏幕旋转的实践解析

ZEGO即构

ios 音视频 屏幕旋转

Tapdata Real Time DaaS 技术详解 PART I :实时数据同步

tapdata

想要入职阿里P6?最少啃完这本500页Java并发多线程源码笔记

Java 编程 面试 多线程 阿里

百度智能云开物工业互联网平台解决方案亮相2021服贸会成果发布会

百度大脑

人工智能 服贸会

MESI缓存一致性协议

Java 架构 面试 后端

阿里后端优化这么恐怖?看完这20W字Java性能实战经验手册,最少P7

Java 阿里巴巴 面试 性能调优 金九银十

交易所刷量机器人定制开发案例(源码搭建)

量化系统19942438797

交易所 做市机器人 自动刷量机器人

大公司运维监控怎么做?从哪些方面考虑?

行云管家

云计算 运维 运维监控 运维审计 数据监控

开源应用中心|动手自建一个超高度自由的个人知识库,原来这么容易!

开源

浪潮云洲发布标识解析数据网关产品

工业互联网

数据脱敏是什么意思?有什么好处?

行云管家

数据库 数据安全 数据脱敏 数据库安全

被面试官问懵:TCP 四次挥手收到乱序的 FIN 包会如何处理?

华为云开发者联盟

TCP 网络 报文 挥手 FIN

联想新IT引擎引领智能化变革,助力“中国力量”更加强大

科技范儿

让 Serverless 应用开发更简单,Serverless Devs 2.0 全新发布

Serverless Devs

开源 Serverless

C语言中动态内存是如何分配的?

华为云开发者联盟

数组 内存 动态内存 内存分配 C语音

"云智一体"全场景智能视频技术与应用解析白皮书下载申请

百度开发者中心

白皮书 云智一体 智能视频

了解JDBC层之QueryDSL

邱学喆

QueryDSL SQLQueryFactory

阿里官方保姆级Java技术图谱发布!够学到春节了,赶紧收藏!

Java 面试 阿里 大厂 金九银十

京东云金秋上云特惠进行中!扫码参与活动

京东科技开发者

云计算 云主机 大促

如何给技术部员工做考核?

石云升

团队管理 管理 引航计划 内容合集 9月日更

读了这篇SpringBoot底层原理让我在阿里成功涨薪40%,感谢

Java 编程 面试 涨薪 阿里

一周信创舆情观察(8.30~9.5)

统小信uos

App 不想被“点名”,mPaaS 隐私合规检测为开发者护航数字生态建设

蚂蚁集团移动开发平台 mPaaS

移动开发 mPaaS 监管合规 隐私安全

Chrome前端调试技巧分享

华为云数据库小助手

大前端 调试 GaussDB 华为云数据库

【墨天轮专访第四期】华为云GaussDB苏光牛:发挥生态优势,培养应用型DBA

墨天轮

数据库 华为云 GaussDB

守护油田安全,EMQ X 在石油石化危化品监测管理中的应用

EMQ映云科技

物联网平台 物联网 IoT 边云协同 emq

前端技术概览

数据库 大数据 时序数据库 tsdb 数据智能

Elasticsearch 原理解析(介绍)

ZzC🍖

搜索引擎 elasticsearch

完整微服务化示例:使用 Apache ServiceComb 进行微服务开发、容器化、弹性伸缩(三)_语言 & 开发_ServiceComb_InfoQ精选文章