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 ...
随机推荐
- ch-manager.sh
[root@dev-clickhouse1 ~]# cat ch-manager.sh #!/bin/bash ch_arr=(ch1-shard1-main ch1-shard2-sub ch2-s ...
- 借助 mkcert 和批处理命令生成局域网证书
借助 mkcert 和批处理命令生成局域网证书 自动获取ipv4,一键生成很方便 cd /d %~dp0 ipconfig |find "IPv4" > ipv4 set / ...
- Django CSRF cookie not set.
错误原因 由于django框架的settings.py配置了中间件,为了防止跨站请求伪造,form表单POST方式会导致出现报错 解决办法: 将'django.middleware.csrf.Csrf ...
- java位运算及移位运算你还记得吗
本文中所提到的运算都是基于整数来说的,因为只有整数(包括正数和负数)在操作系统中是以二进制的补码形式运算的,关于原码.反码.补码.位运算.移位运算的背景这里不再介绍,网上资料很多,感兴趣的可自行搜索. ...
- 谈谈 Kafka 的幂等性 Producer
使用消息队列,我们肯定希望不丢消息,也就是消息队列组件,需要保证消息的可靠交付.消息交付的可靠性保障,有以下三种承诺: 最多一次(at most once):消息可能会丢失,但绝不会被重复发送. 至少 ...
- javascript事件循环机制及面试题详解
javascript是单线程执行的程序,也就是它只有一条主线,所有的程序都是逐行"排队"执行,在这种情况下可能存在一些问题,比如说setTimeout.ajax等待执行的时间较长, ...
- 使用logrotate定期切割nginx日志
前言 默认情况下,nginx的日志都会写到access.log文件中,访问流量大的话,日志文件很快就会膨胀到几十G,不方便分析处理,也占用硬盘空间.借助linux自带的logrotate工具可以很方便 ...
- 不想引入mq?试试debezium
有句话叫做"如无必要,勿增实体". 在一些小型项目当中,没有引入消息中间件,也不想引入,但有一些业务逻辑想要解耦异步,那怎么办呢? 我们的web项目,单独内网部署,由于大数据背景, ...
- .NET Core多线 (5) 常见性能问题
合集:.NET Core多线程温故知新 .NET Core多线程(1)Thread与Task .NET Core多线程(2)异步 - 上 .NET Core多线程(3)异步 - 下 .NET Core ...
- [ABC129E] Sum Equals Xor
2023-01-15 题目 题目传送门 翻译 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 dp/模拟 解题思路 我们都知道,异或是一种不进位的加法,而要想 $ a ...