如何深入理解Istio实践(3)的精髓?

2026-05-25 15:341阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1449个文字,预计阅读时间需要6分钟。

如何深入理解Istio实践(3)的精髓?

前言:接上一篇关于istio应用部署及服务间调用的文章,本文将介绍通过构建.netcore与springboot简单服务应用,实现服务间调用及相关路由控制等。

1. .netcore代码介绍及应用部署

创建一个.netcore webapi服务项目:

dotnet new webapi -n .netcoreWebapi

如何深入理解Istio实践(3)的精髓?

进入项目目录,添加依赖:

dotnet add package Microsoft.AspNetCore.Mvcdotnet add package Swashbuckle.AspNetCore

创建控制器`WeatherForecastController`:

csharpusing Microsoft.AspNetCore.Mvc;

namespace .netcoreWebapi.Controllers{ [ApiController] [Route([controller])] public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries=new[] { Freezing, Bracing, Chilly, Cool, Mild, Warm, Balmy, Hot, Sweltering, Scorching };

private readonly ILogger _logger;

public WeatherForecastController(ILogger logger) { _logger=logger; }

[HttpGet] public IEnumerable Get() { var rng=new Random(); return Enumerable.Range(1, 5).Select(index=> new WeatherForecast { Date=DateTime.Now.AddDays(index), TemperatureC=rng.Next(-20, 55), Summary=Summaries[rng.Next(Summaries.Length)] }) .ToArray(); } }

public class WeatherForecast { public DateTime Date { get; set; }

public int TemperatureC { get; set; }

public string Summary { get; set; } }}

在`Program.cs`中配置路由:

csharpvar builder=WebApplication.CreateBuilder(args);

// 添加服务builder.Services.AddControllers();

var app=builder.Build();

// 配置HTTP请求管道app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();

app.Run();

运行项目,访问`http://localhost:5000/weatherforecast`,即可看到服务返回的天气数据。

2. SpringBoot简单服务应用

创建一个SpringBoot服务项目:

shellmvn archetype:generate

选择`maven-archetype-spring-boot`,然后输入`groupId`、`artifactId`和`version`。

添加依赖:

xml org.springframework.boot spring-boot-starter-web

创建控制器`WeatherForecastController`:

javapackage com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;import java.util.Arrays;import java.util.List;

@RestControllerpublic class WeatherForecastController {

private static final List WEATHERS=Arrays.asList( new WeatherForecast(LocalDate.now(), -20, Freezing), new WeatherForecast(LocalDate.now().minusDays(1), -15, Bracing), new WeatherForecast(LocalDate.now().minusDays(2), 0, Chilly), new WeatherForecast(LocalDate.now().minusDays(3), 10, Cool), new WeatherForecast(LocalDate.now().minusDays(4), 20, Mild) );

@GetMapping(/weatherforecast) public List getWeatherForecast() { return WEATHERS; }}

class WeatherForecast { private LocalDate date; private int temperature; private String summary;

public WeatherForecast(LocalDate date, int temperature, String summary) { this.date=date; this.temperature=temperature; this.summary=summary; }

// 省略getter和setter}

启动SpringBoot应用,访问`http://localhost:8080/weatherforecast`,即可看到服务返回的天气数据。

以上是构建.netcore与SpringBoot简单服务应用,实现服务间调用及相关路由控制的方法。

前言:接上一篇istio应用部署及服务间调用,本文介绍通过构建.netcore与springboot简单服务应用,实现服务间调用及相关路由控制等 1、.netcore代码介绍及应用部署
  • 新建.netcore webapi服务项目,添加简单服务调用方法(getStrByServiceName与getStrByIPAddress),返回默认字符串方法getDetaultStr
  • 通过我们前面文章《Azure 实践(3)- Azure Devops构建.netcore项目,打包Docker镜像+运行容器部署》,打包我们的服务应用,并构建镜像推送到docker hub中,构建Tag为45的镜像
  • 创建netapp-1nodes.yaml文件,构建应用netapp及k8s svc service对外提供服务访问
  • 创建命名空间netistiodemo,并设置istio自动注入:

    sudo kubectl create namespace netistiodemo sudo kubectl label namespace netistiodemo istio-injection=enabled sudo kubectl get ns netistiodemo --show-labels # 查看注入状态

  • 创建应用(namespace:netistiodemo):

    sudo kubectl apply -f netapp-1nodes.yaml -n netistiodemo

  • 创建netapp-destination.yaml并创建DestinationRule

    sudo kubectl apply -f netapp-destination.yaml -n netistiodemo

  • 创建Gateway & VirtualService

    sudo kubectl apply -f nettapp-vs-v1.yaml -n netistiodemo

  • GateWay设置的port端口为81,由于istio-ingressgateway的80端口,我们已经开放对应了springbootapp应用,所以我们要给istio-ingressgateway添加端口映射,映射到netapp应用上,我们可以通过rancher管理工具添加端口映射,当然你也可以通过编辑istio-ingressgateway的yaml文件来添加端口映射
  • 这样,我们就通过多个gateway来访问不同命名空间的应用(k8s节点ip+端口31381)来访问netapp;(k8s节点ip+端口31380)来访问springbootapp
2、springboot代码介绍及应用部署
  • springboot服务项目,参考我以前的dubbo实践代码,这里只展示我们要用的简单的webapi服务
  • 部署应用参考前面两篇文章,都是基于这个应用部署的,使用到2个版本;这里省略部署步骤(命名空间:springistiodemo)
3、springboot应用与.netcore服务应用调用介绍
  • 我们可以通过netapp的方法(getStrByServiceName与getStrByIPAddress)来调用springbootapp的hello服务方法
  • 我通过管理工具kiali的服务调用链路图来展示服务调用关系;有蓝色线的是情况1,纯绿色先的是情况2
4、路由控制
  • 配置1:修改springbootapp-vs-v1.yaml文件,添加不同命名空间的应用服务的配置,添加多个gateway
  • 说明:

    gateway:springbootapp-gateway为同namespace的gateway;netistiodemo/netapp-gateway为netistiodemo空间的gateway,格式/ match:uri prefix前缀匹配,将以/net/、/netcore/为前缀的请求,映射到netapp服务上;请求规则支持exact(完全匹配),prefix(前缀匹配)、regex(正则匹配)三种匹配方式 host:netapp-svc.netistiodemo.svc.cluster.local,指向namespace为netistiodemo的.netcore服务中,格式++ +

  • 路由结果(两个gateway的监听端口均可访问),并且不同的uri前缀(/net/ 与/netcore/)都定位到了服务
  • 配置2:路由直接匹配到应用服务具体的服务上(netapp应用的api/Query/getDetaultStr服务)
  • 配置3:通过添加spring的前缀,定位到本namespace的springbootapp应用上
  • 配置4:如无路由匹配规则(无前缀匹配),则直接定位到netcoreapp上
  • Istio virtual service文件springbootapp-vs-v1.yaml详情:

    apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: springbootapp-v1 spec: hosts: - "*" gateways: - springbootapp-gateway - netistiodemo/netapp-gateway http: - fault: delay: fixedDelay: 1s percent: 100 match: - uri: prefix: /net/ - uri: prefix: /netcore/ rewrite: uri: / route: - destination: host: netapp-svc.netistiodemo.svc.cluster.local port: number: 8081 subset: v1 - match: - uri: exact: /netdefault rewrite: uri: /api/Query/getDetaultStr route: - destination: host: netapp-svc.netistiodemo.svc.cluster.local port: number: 8081 subset: v1 - match: - uri: exact: /redirect redirect: authority: springbootapp-svc uri: /hello - match: - uri: prefix: /spring rewrite: uri: / route: - destination: host: springbootapp-svc port: number: 8080 subset: v1 weight: 70 - destination: host: springbootapp-svc port: number: 8080 subset: v2 weight: 30 timeout: 5s - route: - destination: host: netapp-svc.netistiodemo.svc.cluster.local port: number: 8081 subset: v1

5、服务调用实践
  • 通过netapp的服务/api/Query/getStrByServiceName传入服务名端口等信息访问springbootapp应用的hello服务;可以看到可以访问到springbootapp的v1和v2版本服务

  • 通过netapp的服务/api/Query/getStrByIPAddress传入IP端口等信息访问springbootapp应用的hello服务;可以看到可以访问到springbootapp的v1和v2版本服务
  • 通过访问springbootapp的svc对外访问端口也可以实现服务调用,且遵循Istio流量规则

本文共计1449个文字,预计阅读时间需要6分钟。

如何深入理解Istio实践(3)的精髓?

前言:接上一篇关于istio应用部署及服务间调用的文章,本文将介绍通过构建.netcore与springboot简单服务应用,实现服务间调用及相关路由控制等。

1. .netcore代码介绍及应用部署

创建一个.netcore webapi服务项目:

dotnet new webapi -n .netcoreWebapi

如何深入理解Istio实践(3)的精髓?

进入项目目录,添加依赖:

dotnet add package Microsoft.AspNetCore.Mvcdotnet add package Swashbuckle.AspNetCore

创建控制器`WeatherForecastController`:

csharpusing Microsoft.AspNetCore.Mvc;

namespace .netcoreWebapi.Controllers{ [ApiController] [Route([controller])] public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries=new[] { Freezing, Bracing, Chilly, Cool, Mild, Warm, Balmy, Hot, Sweltering, Scorching };

private readonly ILogger _logger;

public WeatherForecastController(ILogger logger) { _logger=logger; }

[HttpGet] public IEnumerable Get() { var rng=new Random(); return Enumerable.Range(1, 5).Select(index=> new WeatherForecast { Date=DateTime.Now.AddDays(index), TemperatureC=rng.Next(-20, 55), Summary=Summaries[rng.Next(Summaries.Length)] }) .ToArray(); } }

public class WeatherForecast { public DateTime Date { get; set; }

public int TemperatureC { get; set; }

public string Summary { get; set; } }}

在`Program.cs`中配置路由:

csharpvar builder=WebApplication.CreateBuilder(args);

// 添加服务builder.Services.AddControllers();

var app=builder.Build();

// 配置HTTP请求管道app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();

app.Run();

运行项目,访问`http://localhost:5000/weatherforecast`,即可看到服务返回的天气数据。

2. SpringBoot简单服务应用

创建一个SpringBoot服务项目:

shellmvn archetype:generate

选择`maven-archetype-spring-boot`,然后输入`groupId`、`artifactId`和`version`。

添加依赖:

xml org.springframework.boot spring-boot-starter-web

创建控制器`WeatherForecastController`:

javapackage com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;import java.util.Arrays;import java.util.List;

@RestControllerpublic class WeatherForecastController {

private static final List WEATHERS=Arrays.asList( new WeatherForecast(LocalDate.now(), -20, Freezing), new WeatherForecast(LocalDate.now().minusDays(1), -15, Bracing), new WeatherForecast(LocalDate.now().minusDays(2), 0, Chilly), new WeatherForecast(LocalDate.now().minusDays(3), 10, Cool), new WeatherForecast(LocalDate.now().minusDays(4), 20, Mild) );

@GetMapping(/weatherforecast) public List getWeatherForecast() { return WEATHERS; }}

class WeatherForecast { private LocalDate date; private int temperature; private String summary;

public WeatherForecast(LocalDate date, int temperature, String summary) { this.date=date; this.temperature=temperature; this.summary=summary; }

// 省略getter和setter}

启动SpringBoot应用,访问`http://localhost:8080/weatherforecast`,即可看到服务返回的天气数据。

以上是构建.netcore与SpringBoot简单服务应用,实现服务间调用及相关路由控制的方法。

前言:接上一篇istio应用部署及服务间调用,本文介绍通过构建.netcore与springboot简单服务应用,实现服务间调用及相关路由控制等 1、.netcore代码介绍及应用部署
  • 新建.netcore webapi服务项目,添加简单服务调用方法(getStrByServiceName与getStrByIPAddress),返回默认字符串方法getDetaultStr
  • 通过我们前面文章《Azure 实践(3)- Azure Devops构建.netcore项目,打包Docker镜像+运行容器部署》,打包我们的服务应用,并构建镜像推送到docker hub中,构建Tag为45的镜像
  • 创建netapp-1nodes.yaml文件,构建应用netapp及k8s svc service对外提供服务访问
  • 创建命名空间netistiodemo,并设置istio自动注入:

    sudo kubectl create namespace netistiodemo sudo kubectl label namespace netistiodemo istio-injection=enabled sudo kubectl get ns netistiodemo --show-labels # 查看注入状态

  • 创建应用(namespace:netistiodemo):

    sudo kubectl apply -f netapp-1nodes.yaml -n netistiodemo

  • 创建netapp-destination.yaml并创建DestinationRule

    sudo kubectl apply -f netapp-destination.yaml -n netistiodemo

  • 创建Gateway & VirtualService

    sudo kubectl apply -f nettapp-vs-v1.yaml -n netistiodemo

  • GateWay设置的port端口为81,由于istio-ingressgateway的80端口,我们已经开放对应了springbootapp应用,所以我们要给istio-ingressgateway添加端口映射,映射到netapp应用上,我们可以通过rancher管理工具添加端口映射,当然你也可以通过编辑istio-ingressgateway的yaml文件来添加端口映射
  • 这样,我们就通过多个gateway来访问不同命名空间的应用(k8s节点ip+端口31381)来访问netapp;(k8s节点ip+端口31380)来访问springbootapp
2、springboot代码介绍及应用部署
  • springboot服务项目,参考我以前的dubbo实践代码,这里只展示我们要用的简单的webapi服务
  • 部署应用参考前面两篇文章,都是基于这个应用部署的,使用到2个版本;这里省略部署步骤(命名空间:springistiodemo)
3、springboot应用与.netcore服务应用调用介绍
  • 我们可以通过netapp的方法(getStrByServiceName与getStrByIPAddress)来调用springbootapp的hello服务方法
  • 我通过管理工具kiali的服务调用链路图来展示服务调用关系;有蓝色线的是情况1,纯绿色先的是情况2
4、路由控制
  • 配置1:修改springbootapp-vs-v1.yaml文件,添加不同命名空间的应用服务的配置,添加多个gateway
  • 说明:

    gateway:springbootapp-gateway为同namespace的gateway;netistiodemo/netapp-gateway为netistiodemo空间的gateway,格式/ match:uri prefix前缀匹配,将以/net/、/netcore/为前缀的请求,映射到netapp服务上;请求规则支持exact(完全匹配),prefix(前缀匹配)、regex(正则匹配)三种匹配方式 host:netapp-svc.netistiodemo.svc.cluster.local,指向namespace为netistiodemo的.netcore服务中,格式++ +

  • 路由结果(两个gateway的监听端口均可访问),并且不同的uri前缀(/net/ 与/netcore/)都定位到了服务
  • 配置2:路由直接匹配到应用服务具体的服务上(netapp应用的api/Query/getDetaultStr服务)
  • 配置3:通过添加spring的前缀,定位到本namespace的springbootapp应用上
  • 配置4:如无路由匹配规则(无前缀匹配),则直接定位到netcoreapp上
  • Istio virtual service文件springbootapp-vs-v1.yaml详情:

    apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: springbootapp-v1 spec: hosts: - "*" gateways: - springbootapp-gateway - netistiodemo/netapp-gateway http: - fault: delay: fixedDelay: 1s percent: 100 match: - uri: prefix: /net/ - uri: prefix: /netcore/ rewrite: uri: / route: - destination: host: netapp-svc.netistiodemo.svc.cluster.local port: number: 8081 subset: v1 - match: - uri: exact: /netdefault rewrite: uri: /api/Query/getDetaultStr route: - destination: host: netapp-svc.netistiodemo.svc.cluster.local port: number: 8081 subset: v1 - match: - uri: exact: /redirect redirect: authority: springbootapp-svc uri: /hello - match: - uri: prefix: /spring rewrite: uri: / route: - destination: host: springbootapp-svc port: number: 8080 subset: v1 weight: 70 - destination: host: springbootapp-svc port: number: 8080 subset: v2 weight: 30 timeout: 5s - route: - destination: host: netapp-svc.netistiodemo.svc.cluster.local port: number: 8081 subset: v1

5、服务调用实践
  • 通过netapp的服务/api/Query/getStrByServiceName传入服务名端口等信息访问springbootapp应用的hello服务;可以看到可以访问到springbootapp的v1和v2版本服务

  • 通过netapp的服务/api/Query/getStrByIPAddress传入IP端口等信息访问springbootapp应用的hello服务;可以看到可以访问到springbootapp的v1和v2版本服务
  • 通过访问springbootapp的svc对外访问端口也可以实现服务调用,且遵循Istio流量规则