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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 随着云原生与微服务发展,新的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搭建和管理企业级网站应用
目录
相关文章
|
28天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。
|
22天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
84 24
|
24天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
109 6
|
2月前
|
Kubernetes Java 微服务
微服务上下线动态感知实现的技术解析
随着微服务架构的广泛应用,服务的动态管理和监控变得尤为重要。在微服务架构中,服务的上下线是一个常见的操作,如何实时感知这些变化,确保系统的稳定性和可靠性,成为了一个关键技术挑战。本文将深入探讨微服务上下线动态感知的实现方式,从技术基础、场景案例、解决思路和底层原理等多个维度进行阐述,并分别使用Java和Python进行演示介绍。
65 4
|
2月前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
66 12
|
2月前
|
Kubernetes Cloud Native 持续交付
容器化、Kubernetes与微服务架构的融合
容器化、Kubernetes与微服务架构的融合
48 1
|
2月前
|
运维 Kubernetes Docker
深入理解容器化技术及其在微服务架构中的应用
深入理解容器化技术及其在微服务架构中的应用
65 1
|
2月前
|
监控 Java 微服务
从零构建微服务架构:一次深度技术探索之旅####
本文作为一篇深度技术分享,引领读者踏上自底向上搭建微服务架构的征途,旨在通过实战经验剖析,揭示微服务转型背后的技术挑战与解决方案。不同于常规摘要仅概述内容,本文摘要将直接以故事化手法,简述作者从单体应用困境出发,逐步迈向微服务化的心路历程,涵盖关键决策点、技术选型考量及实践收获,激发读者对微服务架构设计与实现的浓厚兴趣。 ####
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。