引言在前面的讲解中,我们已经提及了微服务的一些弊端,并介绍了Istio这样的解决方案 。那么,对于我们开发人员来说 , Istio究竟会带来哪些变革呢?今天我们就来简要探讨一下!
Kube.NETes简单介绍Kubernetes,俗称K8s,仅仅是因为L与s之间有8个字母所以叫的K8s,是一种用于管理和编排Docker集群的工具 。它被广泛使用且备受推崇,因此在讲解Istio技术时,我们选择与Kubernetes进行集成开发 。接下来 , 我们将重点关注如何在集成了Istio的项目中进行代码编写和重构 。尽管Kubernetes技术对于开发者来说关系不是特别密切,但我们会在以后的时间里专门设立一个Kubernetes系列专栏,来详细介绍该技术 。
bookinfo 架构介绍bookinfo是Istio提供的学习样例,通过使用bookinfo , 您可以更深入地理解Istio提供的路由、遥测等功能 。下图展示了bookinfo在未集成Istio之前的物理架构:
文章插图
图片
bookinfo是一个在线书店应用 , 由四个微服务组成,分别是Product page、Reviews、DetAIls和Ratings 。为了展示Istio的无侵入性,这四个微服务分别使用Python/ target=_blank class=infotextkey>Python、JAVA、Ruby和Node进行开发 。下面对每个服务进行详细说明:
Product page:这是一个聚合服务,它通过聚合Reviews和Details的内容来展示产品页面 。
Details:这是图书详情服务 , 提供了书籍的详细信息 。
Reviews:这是图书评价服务,它有多个版本供选择 。Reviews还是一个聚合服务,它将Ratings的评分信息与评价内容进行聚合 。
Ratings:这是图书预订排名服务 , 提供了图书的评分信息 。
下图展示了bookinfo在嵌入了Istio后的物理架构:
文章插图
图片
部署 bookinfo 应用为了简化bookinfo应用的部署过程,可以使用批注入的方式来自动注入sidecar 。这样可以避免每次手动注入sidecar的繁琐步骤 。
配置 istio 自动注入批注入是一种将sidecar自动注入到Kubernetes部署中的方法 。通过批注入,可以在应用部署的同时自动添加sidecar容器,而无需手动进行注入操作 。
在部署bookinfo应用之前 , 需要确保已经安装和配置了Istio 。然后,可以按照以下步骤进行批注入部署bookinfo应用:
kubectl create ns testkubectl label ns test istio-injectinotallow=enabledkubectl get ns test --show-labels
部署 bookinfo 应用kubectl Apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n test
这里就不再赘述了,你可以在官方网站上详细了解:https://istio.io/latest/zh/docs/examples/bookinfo/当你部署完bookinfo 之后,打开浏览器并访问网址,多次刷新页面,你会发现 bookinfo 应用使用了多个不同版本的 reviews,如下所示:
Review-v1
文章插图
图片
Review-v2
文章插图
图片
Review-v3
文章插图
图片
bookinfo 服务调用示意图
文章插图
图片
代码开发这里我们将不再配置关于Istio的虚拟服务和路由规则 。这些都可以通过编写一个YAML格式的文件,并在Kubernetes中执行一条命令来完成 。你可以参考官方提供的示例来进行配置 。配置完成后,Istio将能够捕获所有当前服务发送的请求,并进行解析路由,从而实现灰度发布、A/B测试、故障注入等逻辑 。但是这不是我们文章的重点 , 我们只需要关注代码的编写即可 。剩下的运维工作将由相关人员负责
在开发之前,让我们先来看一下官方Github上的bookinfo项目是如何进行调用的 。官方仓库的地址是:https://github.com/istio/istio/blob/master/samples/bookinfo/src/reviews/reviews-application/src/main/java/application/rest/LibertyRestEndpoint.java
我已经将地址定位到了我们关注的Java文件 。如果你是Python开发或者使用Node.js,你可以自行切换到相应的目录 。无论使用哪种语言,基本的逻辑都是相同的 。
private final static Boolean ratings_enabled = Boolean.valueOf(System.getenv("ENABLE_RATINGS"));private final static String star_color = System.getenv("STAR_COLOR") == null ? "black" : System.getenv("STAR_COLOR");private final static String services_domain = System.getenv("SERVICES_DOMAIN") == null ? "" : ("." + System.getenv("SERVICES_DOMAIN"));private final static String ratings_hostname = System.getenv("RATINGS_HOSTNAME") == null ? "ratings" : System.getenv("RATINGS_HOSTNAME");private final static String ratings_port = System.getenv("RATINGS_SERVICE_PORT") == null ? "9080" : System.getenv("RATINGS_SERVICE_PORT");private final static String ratings_service = String.format("http://%s%s:%s/ratings", ratings_hostname, services_domain, ratings_port);private final static String pod_hostname = System.getenv("HOSTNAME");private final static String clustername = System.getenv("CLUSTER_NAME");//·······此处省略没必要的代码//调用逻辑private JsonObject getRatings(String productId, HttpHeaders requestHeaders) {ClientBuilder cb = ClientBuilder.newBuilder();Integer timeout = star_color.equals("black") ? 10000 : 2500;cb.property("com.ibm.ws.jaxrs.client.connection.timeout", timeout);cb.property("com.ibm.ws.jaxrs.client.receive.timeout", timeout);Client client = cb.build();WebTarget ratingsTarget = client.target(ratings_service + "/" + productId);Invocation.Builder builder = ratingsTarget.request(MediaType.APPLICATION_JSON);//·······此处省略没必要的代码
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 云服务器应用优势分析,你知道有哪些有事吗?
- 听说你会架构设计?来,弄一个微信群聊系统
- 手机号更换微信显示已用解决方法
- 屡涉传销,上市洗白,昔日微商今何在?
- “微信新增独立发送按钮”冲上热搜!史诗级更新?网友热议
- 微信手机号码怎么解绑,微信地图怎么上传商家位置?
- 微信怎么监视对方聊天记录
- 微信聊天记录恢复:解决重要信息丢失的困扰
- 微信再次更新,多款应用将受到限制,众多网友拍手叫好
- 微信终于更新,五大变化个个给力