【技术干货】K8S环境微服务本地调试方法

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 随着云原生与微服务发展,新的Java开发栈基本上都切换到了微服务体系,部署环境也都切换到了基于K8S的云原生体系。在这一套体系下单体服务的开发和迭代得到了极大的效率提升,然而在后端服务之间存在依赖关系需要进行联调时也变得极为复杂,本文主要介绍一种在这种环境下的编码方式与联调方法供大家参考。

因为涉及到开发环境与部署环境,首先我们确认一种高效率的开发联调方式是我们自己负责开发的工程可以在本地IDE进行修改启动,而我们依赖的其他服务可以使用部署环境里面已经完成部署的稳定服务,如下图:

在这种情况下主要需要解决两个问题,1. 本地网络环境与K8S环境的网络链路打通,2. k8s环境的微服务本地发现与调用打通。

服务网络链路打通方法

首先介绍一个工具:kubefwd。【链接

kubefwd 是一个用于端口转发Kubernetes中指定namespace下的全部或者部分pod的命令行工具。 kubefwd 使用本地的环回IP地址转发需要访问的service,并且使用与service相同的端口。 kubefwd会临时将service的域条目添加到 /etc/hosts 文件中。

首先确认对应的微服务已经在k8s中配置了service,比如配置微服务1的service为app1,端口为8080

首先需要安装kubectl,kubectl安装参考【链接

Mac安装

brew install txn2/tap/kubefwd

Windows安装

scoop install kubefwd

使用:以mac为例

# -c, --kubeconfig  -n, --namespace

sudo kubefwd svc -c kubeConfig.yaml -n default


# 检查标准输出中的Forwarding条目中存在你定义的service,比如app1:8080

# 然后本地进行curl,检查服务是否正确返回

curl app1:8080

服务发现打通方法

Java微服务体系中,目前比较普遍的方式是使用SpringCloud微服务体系,使用注册中心的方法将微服务注册上去,消费者通过服务名到注册中心获取提供者的ip端口。

因为微服务注册在K8s中,这种情况下注册到注册中心的ip地址一般为该微服务的pod地址,而pod的网络与本地的开发网络是隔离的,所以这里需要将微服务之间调用的地址替换为service名字,使用上文介绍的kubefwd的方式打通的服务网络进行微服务调用。

以下以feignClient的调用为例子,此处为消费者部分代码

SpringBootApplication  的主入口,如application.java

注释掉@EnableFeignClients相关的注解

@EnableDiscoveryClient

//@EnableFeignClients(basePackages = {

//        "com.aliyun.gts.work.flow.api.api"

//})

@MapperScan("com.aliyun.gts.delivery.capabilities.infrastructure.domain.repository")

public class Application {


   public static void main(String[] args) {

       SpringApplication.run(Application.class, args);

   }

}


显示声明对api的引用,此处以FlowProcessApi为例子(一个feign接口)

FlowApi.java

import com.aliyun.gts.delivery.capabilities.boot.FeignConfiguration;

import com.aliyun.gts.work.flow.api.api.FlowProcessApi;

import feign.Contract;

import feign.Feign;

import feign.Logger;

import feign.codec.Decoder;

import feign.codec.Encoder;

import lombok.Builder;

import org.apache.commons.lang3.StringUtils;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.cloud.openfeign.FeignClient;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;


@Configuration

public class FlowApi {

   @Value("${flow-service.endpoint:}")

   private String endpoint;


   @Bean

   FlowProcessApi flowProcessApi() {

       return create(FlowProcessApi.class, endpoint);

   }


   @Autowired

   Contract contract;

   @Autowired

   Decoder decoder;

   @Autowired

   Encoder encoder;


   protected <T> T create(Class<T> t, String endpoint) {

       return create(t, endpoint,

               LogConfig.builder()

                       .logger(new Logger.JavaLogger())

                       .level(Logger.Level.NONE).build()

       );

   }


   protected <T> T create(Class<T> t, String endpoint, LogConfig logConfig) {

       String url = t.getAnnotation(FeignClient.class).value();

       if (StringUtils.isNotBlank(endpoint)) {

           url = buildUrl(endpoint);

       }

       T client = Feign.builder()

               .logger(logConfig.logger).logLevel(logConfig.level)

               .contract(contract)

               .encoder(encoder)

               .decoder(decoder)

               .requestInterceptor(new FeignConfiguration())

               .target(t, url);

       return client;

   }


   public static String buildUrl(String url) {

       if (StringUtils.isBlank(url)) {

           return "";

       }

       if (url.startsWith("http://") || url.startsWith("https://")) {

           return url;

       }

       return "http://" + url;

   }


   @Builder

   static class LogConfig {

       private Logger logger;

       private Logger.Level level;

   }

}

在application.yaml(相应环境的配置文件中添加微服务的endpoint)

# 在k8s中的服务名,当本地kubefwd完成之后可以本地进行curl测试是否正常

flow-service.endpoint: flow.service:8080


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
缓存 Kubernetes Docker
GitLab Runner 全面解析:Kubernetes 环境下的应用
GitLab Runner 是 GitLab CI/CD 的核心组件,负责执行由 `.gitlab-ci.yml` 定义的任务。它支持多种执行方式(如 Shell、Docker、Kubernetes),可在不同环境中运行作业。本文详细介绍了 GitLab Runner 的基本概念、功能特点及使用方法,重点探讨了流水线缓存(以 Python 项目为例)和构建镜像的应用,特别是在 Kubernetes 环境中的配置与优化。通过合理配置缓存和镜像构建,能够显著提升 CI/CD 流水线的效率和可靠性,助力开发团队实现持续集成与交付的目标。
|
3月前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
102 14
|
4月前
|
Kubernetes 监控 Cloud Native
|
3月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
3月前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
75 3
|
3月前
|
Kubernetes 监控 安全
容器化技术:Docker与Kubernetes的实战应用
容器化技术:Docker与Kubernetes的实战应用
|
4月前
|
Kubernetes 安全 Linux
ansible-install-k8s 之 1 初始化环境
ansible-install-k8s 之 1 初始化环境
|
4月前
|
Kubernetes Docker 微服务
微服务实践k8s&dapr开发部署实验(1)服务调用(一)
微服务实践k8s&dapr开发部署实验(1)服务调用(一)
66 2
|
4月前
|
负载均衡 Kubernetes 区块链
随机密码生成器+阿里k8s负载均衡型服务加证书方法+移动终端设计+ico生成器等
随机密码生成器+阿里k8s负载均衡型服务加证书方法+移动终端设计+ico生成器等
84 1
|
4月前
|
Kubernetes Cloud Native 云计算
云原生时代的技术演进:Kubernetes与微服务架构的完美融合
随着云计算技术的飞速发展,云原生概念逐渐深入人心。本文将深入探讨云原生技术的核心——Kubernetes,以及它如何与微服务架构相结合,共同推动现代软件架构的创新与发展。文章不仅剖析了Kubernetes的基本工作原理,还通过实际案例展示了其在微服务部署和管理中的应用,为读者提供了一条清晰的云原生技术应用路径。
127 2