【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

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

评论

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

SpringBoot 源码 | prepareEnvironment 方法解析

Java-fenn

Java

LeetCode-1370. 上升下降字符串(Java)

bug菌

9月日更 Leet Code 9月月更

字节架构师:来说说 Kafka 的消费者客户端详解,你都搞懂了吗?

Java快了!

Kafk

开箱即用,40 个 SpringBoot 常用注解!

Java-fenn

详解容灾架构中的数据复制技术

Java-fenn

Java

九个写 TypeScript 的坏习惯,看看你有没有?

Java-fenn

Java

Plasticine: 面向并行模式的可重配架构

俞凡

架构 网络

Java进阶(十五)Java中设置session的详细解释

No Silver Bullet

Java session Cookie 9月月更

阿里前端常见面试题(附答案)

loveX001

前端 前端javascript

【全网最全】你绝对没见过的,Alibaba内部的18份Java技术体系教程

程序知音

Java JVM 阿里 程序员面试 后端技术

LeetCode-1002. 查找常用字符(Golang)

bug菌

9月日更 Leet Code 9月月更

什么是X态传播?

Java-fenn

Java

22个每个程序员都应该知道的 Git 命令

Java-fenn

Java

树莓派部署Elasticsearch6集群

程序员欣宸

elasticsearch 9月月更

Netty系列教程(二)Netty架构设计剖析

Java-fenn

Java

太赞了,使用应用魔方 AppCube,我没有写一行代码就开发出了一款投票微信小程序

wljslmz

微信小程序 低代码开发 AppCube 9月月更

GreatSQL vs MySQL性能测试来了,速围观~

Java-fenn

Java java;

知道这些坑,你还敢乱把单体架构拆成分布式吗

Java-fenn

Java

Java 多线程:锁

Java-fenn

Java

SAP 电商云 Spartacus UI 同 SAP Customer Data Cloud 的集成

Jerry Wang

typescript SAP Hybris Spartacus 9月月更

C++最佳实践 | 6. 性能

Java-fenn

Java

C++ 20 协程 Coroutine之剖析

Java-fenn

Java

Fast.Framework ORM 于中秋节后 正式开源

Java-fenn

Java

大厂工程师如何给SpringBoot封装响应数据和异常处理?

Java-fenn

Java

HTTPS TLS 1.2

懒时小窝

https HTTP

库调多了,都忘了最基础的概念-《单例模式VS状态码》

知识浅谈

volatile 单例模式 9月月更

全到哭!从面试到架构,阿里大佬用五部分就把高并发编程讲清楚了

Java全栈架构师

Java 程序员 面试 程序人生 高并发

k8s中几个基本概念的理解

Java-fenn

Java

分布式锁有哪些实现方案各自有什么优缺点?

想要飞的猪

分布式锁 redis分布式锁 zookeeper分布式锁

设计模式之工厂方法模式--更加符合开闭原则的工厂模式

Java-fenn

Java

数据治理(十四):Ranger同步Linux用户

Lansonli

数据治理 数据安全 9月月更

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