【AICon】硅谷视野+中国实践,汇聚全球顶尖技术的 AI 科技盛会 >>> 了解详情
写点什么

完整微服务化示例:使用 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:10577

评论

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

【Java基础】Java对象创建的几种方式

No8g攻城狮

Java 后端 Java 分布式 Java 开发

Teradata 落幕中国的三个变化:“国产平替”变褒义、重型方法论不如最佳实践、前后端数据服务贴合

B Impact

那些高级前端是如何回答面试题的

loveX001

JavaScript

ElasticSearch _bulk 使用与实战:批量操作、查询、冲突(模拟电商下单/查询)

alexgaoyh

批量操作 Elastic Search 关联查询 _bulk retry_on_conflict

能否手写vue3响应式原理-面试进阶

helloworld1024fd

JavaScript

[go]交叉编译

追赶者

Go go build 交叉编译

腾讯前端经典react面试题(附答案)

beifeng1996

React

手撕常见JS面试题

helloworld1024fd

JavaScript

云计算未来 5 年发展方向大盘点

亚马逊云科技 (Amazon Web Services)

人工智能

2023-02-18:ffmpeg是c编写的音视频编解码库,请问用go语言如何调用?例子是03输出版本号。

福大大架构师每日一题

golang 音视频 ffmpeg 流媒体 福大大

面试官让你说说react状态管理?

beifeng1996

React

vue组件通信方式有哪些?

bb_xiaxia1998

Vue

美团前端一面手写面试题

helloworld1024fd

JavaScript

React源码分析1-jsx转换及React.createElement

goClient1992

React

架构实战营-模块二作业

🐢先生

架构实战营

【Ask100-3】 用ARR衡量SaaS企业发展,需要怎样的前提?

B Impact

阿里前端经典react面试题集锦

beifeng1996

React

架构训练营第10期模块7作业

Geek_4db2d5

React源码分析(三):useState,useReducer

goClient1992

React

【立哥】【每日一个小知识】企业家和管理者有什么区别?

Lee Chen

开源SPL助力JAVA处理公共数据文件(txt/csv/json/xml/xsl)

石臻臻的杂货铺

Java 开源

如何使用 ArrayPool

newbe36524

C# Docker Kubernetes

从这两道题重新理解,JS的this、作用域、闭包、对象

loveX001

JavaScript

从输入URL到渲染的过程中到底发生了什么?

loveX001

JavaScript

vue这些原理你都知道吗?(面试版)

bb_xiaxia1998

Vue

React源码分析(二)渲染机制

goClient1992

React

Ubuntu18.04编译ZLMediakit支持webrtc

alps2006

WebRTC

高级前端一面面试题集锦

loveX001

JavaScript

美团前端一面高频vue面试题整理

bb_xiaxia1998

Vue

社招前端经典vue面试题(附答案)

bb_xiaxia1998

Vue

社招前端必会手写面试题集锦

helloworld1024fd

JavaScript

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