本文转载自 微服务 开源项目 Apache ServiceComb (incubating) 官网博客:
http://servicecomb.incubator.apache.org/cn/docs/linuxcon-workshop-demo/
http://servicecomb.incubator.apache.org/cn/docs/company-on-kubernetes/
http://servicecomb.incubator.apache.org/cn/docs/autoscale-on-company/
微服务架构作为新兴领域的架构模式,已步入产品化形态,与容器化、集群等一起成为了当下热点。而微服务、Docker、kubernetes 之间的关系,究竟这三者之间是什么样的关系,分别能在微服务领域发挥什么作用,却常给入门的读者和用户带来些许迷茫感。
本文使用一个简单的普适性的 微服务 示例,从 业务场景入手,到微服务架构设计、实现、容器化、集群部署、压测、弹性伸缩、资源控制,端到端以最直白的方式演示了这三者的关系,会给读者带来不一样的真切的理念体验和感受,增强对系列概念的理解。
普适性微服务化示例
为了读者能更容易了解ServiceComb微服务框架的功能以及如何用其快速开发微服务,所以提供大家耳熟能详的例子,降低学习曲线的同时,增加趣味性,加深理解。
本文中假设我们成立了一家科研公司,处理复杂的数学运算,以及尖端生物科技研究,并为用户提供如下服务:
黄金分割数列计算
蜜蜂繁殖规律 (计算每只雄蜂/雌蜂的祖先数量)
但是我们如何将公司的这些强大运算能力提供给我们的消费者呢?
首先我们通过认证服务保障公司的计算资源没有被滥用, 同时我们对外提供Rest服务让用户来进行访问。 下面的视频展示具体的服务验证调用的情况。
业务场景
让我们先对业务场景进行总结分析
为了公司持续发展,我们需要对用户消费的运算能力收费,所以我们聘用了门卫认证用户,避免不法分子混入
为了提供足够的黄金分割数量运算能力,我们需要雇佣相应的技工
为了持续研究蜜蜂繁殖规律,公司建立了自己的蜂场,需要相应的养蜂人进行管理研究
为了平衡技工、养蜂人、和门卫的工作量和时间,我们建立了告示栏机制,让当前有闲暇的人员发布自己的联系方式,以便我们能及时联系技能匹配的人员以服务到来的用户
因为运算能力成本高昂,我们将运算项目进行了归档,以便未来有相同请求时,我们能直接查询项目归档,节省公司运算成本
面对上述复杂的场景,我们又聘用了部门经理来管理公司成员和设施
最后,当公司日益壮大,用户数量暴涨时,我们还需要招聘更多技工、养蜂人、和门卫,所以增加了人力资源部门
公司结构 (系统架构)
到现在业务场景已经比较清晰,我们把上述职务部门和设施画成公司组织结构图。
现在公司组织结构已经完整,让我们着手搭建相应部门。
技工 (Worker)
因为技工最为简单,对其他部门人员依赖最少,我们首先搭建这个部门。
黄金分割运算服务
技工的主要工作时提供黄金分割数列计算服务,当用户需要知道第n个黄金分割数时,技工以最快的速度计算出数值并返回给用户。 我们可以把这个工作简化为如下数学方程:
value = fibo(n)
在暂时不考虑性能的情况下,我们可以迅速实现黄金分割数列的计算。
interface FibonacciService {
long term(int n);
}
@Service
class FibonacciServiceImpl implements FibonacciService {
@Override
public long term(int n) {
if (n == 0) {
return 0;
} else if (n == 1) {
return 1;
}
return term(n - 1) + term(n - 2);
}
}
技工服务端点
黄金分割数量运算已经实现,现在我们需要将服务提供给用户,首先我们定义端点接口:
public interface FibonacciEndpoint {
long term(int n);
}
引入 ServiceComb
依赖:
<dependency>
<groupId>org.apache.servicecomb</groupId>
<artifactId>spring-boot-starter-provider</artifactId>
</dependency>
接下来我们同时暴露黄金分割运算服务的Restful和RPC端点:
@RestSchema(schemaId = "fibonacciRestEndpoint")
@RequestMapping("/fibonacci")
@Controller
public class FibonacciRestEndpoint implements FibonacciEndpoint {
private final FibonacciService fibonacciService;
@Autowired
FibonacciRestEndpoint(FibonacciService fibonacciService) {
this.fibonacciService = fibonacciService;
}
@Override
@RequestMapping(value = "/term", method = RequestMethod.GET)
@ResponseBody
public long term(int n) {
return fibonacciService.term(n);
}
}
@RpcSchema(schemaId = "fibonacciRpcEndpoint")
public class FibonacciRpcEndpoint implements FibonacciEndpoint {
private final FibonacciService fibonacciService;
@Autowired
public FibonacciRpcEndpoint(FibonacciService fibonacciService) {
this.fibonacciService = fibonacciService;
}
@Override
public long term(int n) {
return fibonacciService.term(n);
}
}
这里用 @RestSchema
和 @RpcSchema
注释两个端点后,ServiceComb
会自动生成对应的服务端点契约,根据如下microsevice.yaml
配置端点端口,并将契约和服务一起注册到Service Center:
# all interconnected microservices must belong to an application wth the same ID
APPLICATION_ID: company
service_description:
# name of the declaring microservice
name: worker
version: 0.0.1
# service center address
cse:
service:
registry:
address: http://sc.servicecomb.io:30100
highway:
address: 0.0.0.0:7070
rest:
address: 0.0.0.0:8080