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

简介: 随着云原生与微服务发展,新的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


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
12月前
|
人工智能 安全 Nacos
Nacos 3.0:微服务与AI融合的技术新纪元
Nacos 3.0:微服务与AI融合的技术新纪元
506 83
|
运维 Kubernetes Cloud Native
智联招聘 × 阿里云 ACK One:云端弹性算力颠覆传统 IDC 架构,打造春招技术新范式
在 2025 年春季招聘季的激战中,智联招聘凭借阿里云 ACK One 注册集群与弹性 ACS 算力的深度融合,成功突破传统 IDC 机房的算力瓶颈,以云上弹性架构支撑千万级用户的高并发访问,实现招聘服务效率与稳定性的双重跃升。
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
600 102
|
缓存 Kubernetes Docker
GitLab Runner 全面解析:Kubernetes 环境下的应用
GitLab Runner 是 GitLab CI/CD 的核心组件,负责执行由 `.gitlab-ci.yml` 定义的任务。它支持多种执行方式(如 Shell、Docker、Kubernetes),可在不同环境中运行作业。本文详细介绍了 GitLab Runner 的基本概念、功能特点及使用方法,重点探讨了流水线缓存(以 Python 项目为例)和构建镜像的应用,特别是在 Kubernetes 环境中的配置与优化。通过合理配置缓存和镜像构建,能够显著提升 CI/CD 流水线的效率和可靠性,助力开发团队实现持续集成与交付的目标。
|
10月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
595 1
|
10月前
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
836 0
|
12月前
|
缓存 负载均衡 NoSQL
基于微服务架构的唯品会商品详情接口技术解析
本文介绍了唯品会电商平台商品详情接口的微服务化实现方案,涵盖架构设计、代码示例与性能优化策略。采用FastAPI构建服务,结合Redis缓存、异步处理、Nginx负载均衡等技术,实现高并发、低延迟的接口性能。
|
Shell Go 开发工具
【环境】Rocky8使用gvm配置Go多版本管理的微服务开发环境(go-zero)
通过本文的介绍,我们详细讲解了如何在Rocky8上使用gvm来管理多个Go版本,并配置go-zero框架的开发环境。通过gvm的灵活管理,开发者可以轻松切换不同的Go版本,以适应不同项目的需求。同时,go-zero框架的使用进一步提升了微服务开发的效率和质量。希望本文能帮助开发者构建高效的Go语言开发环境,提高项目开发的灵活性和稳定性。
537 63
|
12月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
1583 0

推荐镜像

更多