Istio:微服务开发的终极利器,你还在为繁琐的通信和部署流程烦恼吗?
引言
在前面的讲解中,我们已经提及了微服务的一些弊端,并介绍了Istio这样的解决方案。那么,对于我们开发人员来说,Istio究竟会带来哪些变革呢?今天我们就来简要探讨一下!
Kubernetes简单介绍
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、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 test
kubectl label ns test istio-injection=enabled
kubectl 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);
//·······此处省略没必要的代码
通过以上的代码,我们可以发现,使用Istio可以大大简化微服务架构中的代码逻辑。通过使用服务名进行HTTP调用,Istio会自动处理请求的路由、负载均衡和流量控制等功能,从而减少了对其他组件的依赖,使代码更加清爽。在实际开发中,可以选择使用OpenFeign或gRPC等技术来实现微服务之间的通信。
OpenFeign是一个基于注解的声明式Web Service客户端,它可以简化HTTP请求的编写和调用。使用OpenFeign,你可以定义一个接口,并使用注解来描述接口的请求路径、请求方法和参数等信息。OpenFeign会根据这些注解自动生成HTTP请求的代码,使开发者可以更加方便地调用其他微服务。
gRPC是一个高性能、开源的远程过程调用(RPC)框架,它使用Protocol Buffers作为接口定义语言(IDL)来定义服务接口和消息格式。通过gRPC,你可以定义一个接口,并使用Protocol Buffers来描述接口的请求和响应消息。gRPC会自动生成客户端和服务端的代码,使开发者可以直接调用远程服务而无需关心底层的网络通信细节。
无论是选择OpenFeign还是gRPC,都可以根据具体的需求和技术栈来决定。它们都提供了方便的工具和框架来简化微服务之间的通信,使开发者可以更加专注于业务逻辑的实现。
总结
总的来说,Istio为开发人员带来了许多变革。首先,它提供了批注入的方式来自动注入sidecar,简化了应用部署的过程。其次,通过Istio,开发人员可以轻松地进行灰度发布、A/B测试和故障注入等操作,而无需手动配置路由规则。此外,Istio还提供了服务发现、负载均衡和流量控制等功能,减少了对其他组件的依赖,使代码更加清爽。在代码开发方面,可以选择使用OpenFeign或gRPC等技术来简化微服务之间的通信。总之,Istio的引入为微服务架构的开发人员提供了更便捷和高效的开发方式。
Istio:微服务开发的终极利器,你还在为繁琐的通信和部署流程烦恼吗?的更多相关文章
- 构建微服务开发环境4————安装Docker及下载常用镜像
[内容指引] 下载Docker: Mac下安装Docker: Windows下安装Docker; 下载常用docker镜像. 一.下载Docker 1.Mac适用Docker下载地址:https:// ...
- 构建微服务开发环境8————Hello 微服务
[内容指引] 1.用IDEA打开微服务项目; 2.更新Maven依赖: 3.IntelliJ IDEA JDK配置; 4.修改代码: 5.运行微服务: 6.将代码变更提交到Github. 经过前面的努 ...
- 黑少微服务商店之Iron Cloud微服务开发云
近日,由黑少微服务研发团队推出的Iron Cloud微服务开发云已经正式对外提供服务,这是国内第一家基于云端操作的微服务专业开发工具. Iron Cloud 微服务开发云(www.ironz.com) ...
- Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲
Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台: 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...
- mPass多租户系统微服务开发平台
目录 项目总体架构图 基于SpringBoot2.x.SpringCloud并采用前后端分离的企业级微服务,多租户系统架构微服务开发平台 mPaaS(Microservice PaaS)为租户业务开发 ...
- python 微服务开发书中几个方便的python框架
python 微服务开发是一本讲python 如果进行微服务开发的实战类书籍,里面包含了几个很不错的python 模块,记录下,方便后期回顾学习 处理并发的模块 greenlet && ...
- 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发
<ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...
- 基于 abp vNext 微服务开发的敏捷应用构建平台 - 项目介绍
缘起 目前使用ABP框架已经将近3年了,大大小小的项目也陆陆续续做了很多.由于现有信息系统的架构模式是在底层的技术平台上直接构建信息系统并采用技术主导,使用业务无关的编程工具来开发信息系统的缺陷使得系 ...
- 基于 abp vNext 微服务开发的敏捷应用构建平台 - 文章目录
系列文章: <基于 abp vNext 微服务开发的敏捷应用构建平台 - 设计构想> [点击查看] <基于 abp vNext 微服务开发的敏捷应用构建平台 - 文章目录> [ ...
- ServiceStage-华为微服务开发与管理平台
前言 在上一篇文章一年前,我来到国企搞IT 中,和小伙伴分享了我在国企这一年当中的所见,所闻,所想,很高兴能够获得很多同道中人的共鸣.过去一年,我的很大一部分工作都投入到公司技术平台的建设中.Jira ...
随机推荐
- AI视频风格转换:Stable Diffusion+EBSynth
这次转换的视频还比较稳定,先给大家看下效果. 这里传不了视频,还是放到盘盘了:https://www.aliyundrive.com/s/5mzfjLViyDa 书接上文,在上一篇文章中,我们首先使用 ...
- 【.NET6 + Vue3 + CentOS7.9 + Docker + Docker-Compose + SSL】个人博客前后端运维部署
个人博客 前端:https://lujiesheng.cn 个人博客 后端:https://api.lujiesheng.cn 个人博客 运维:https://portainer.lujiesheng ...
- 从read 系统调用到 C10M 问题
一.前言 从上个世纪到现在,工程师们在优化服务器性能的过程中,提出了各种不同的io模型,比如非阻塞io,io复用,信号驱动式io,异步io.具体io模型在不同平台上的实现也不一样,比如io复用在bsd ...
- Unity的UnityStats: 属性详解与实用案例
UnityStats 属性详解 UnityStats 是 Unity 引擎提供的一个用于监测游戏性能的工具,它提供了一系列的属性值,可以帮助开发者解游戏的运行情况,从而进行优化.本文将详细介绍 Uni ...
- 解析PPTX 遇到异常:“\b”(十六进制值 0x08)是无效的字符。
问题描述: 通过DocumentFormat.OpenXml解析PPTX文件时遇到异常:"\b"(十六进制值 0x08)是无效的字符,查看文件发现存在乱码,乱码的十六进制值刚好时异 ...
- Windows平台的JDK安装及IDEA配置JDK的过程
1.下载安装包 jdk-8u201-windows-x64.exe,即jdk1.8.0_201 链接:https://pan.baidu.com/s/1WYaTlProtHkC_KyMHIUBxQ?p ...
- 8.0 Python 使用进程与线程
python 进程与线程是并发编程的两种常见方式.进程是操作系统中的一个基本概念,表示程序在操作系统中的一次执行过程,拥有独立的地址空间.资源.优先级等属性.线程是进程中的一条执行路径,可以看做是轻量 ...
- Sealos 国内集群正式上线,可一键运行 LLama2 中文版大模型!
2023 年 7 月 19 日,MetaAI 宣布开源旗下的 LLama2 大模型,Meta 首席科学家.图灵奖得主 Yann LeCun 在推特上表示 Meta 此举可能将改变大模型行业的竞争格局. ...
- 程序员 不得不知道的 API 接口常识
说实话,我非常希望自己能早点看到本篇文章,大学那个时候懵懵懂懂,跟着网上的免费教程做了一个购物商城就屁颠屁颠往简历上写. 至今我仍清晰地记得,那个电商教程是怎么定义接口的: 管它是增加.修改.删除.带 ...
- git status详解
git status详解 在使用Git进行版本控制时,git status是一个非常有用的命令,用于查看当前代码仓库的状态.它可以告诉你哪些文件已更改.添加或删除,以及是否有未提交的更改等.本篇博客文 ...