使用Linkerd进行服务网格配置与监控

在现代微服务架构中,服务网格技术正在迅速成为增强服务间通信的解决方案。Linkerd作为一个轻量级的服务网格,提供了重要的功能,如负载均衡、故障恢复和监控。这篇博客将详细介绍如何使用Linkerd配置服务网格,并通过Java代码示例展示如何在微服务中集成Linkerd。

1. 什么是服务网格?

服务网格是一种专门用于处理服务间通信的基础设施层,通常通过轻量级代理(sidecar)在服务之间进行通信。服务网格可以解决微服务架构中的许多复杂性,例如服务发现、负载均衡、故障恢复、安全、监控和跟踪等。

2. Linkerd简介

Linkerd是一个开源服务网格,提供了一种即插即用的解决方案,易于安装和配置。它为微服务提供了透明的功能,使开发者能够专注于业务逻辑,而不必担心服务间的复杂通信。

3. Linkerd的安装

在使用Linkerd之前,确保已经安装了以下工具:

  • Kubernetes集群(可以使用Minikube、GKE、EKS等)
  • kubectl(Kubernetes命令行工具)

接下来,按照以下步骤安装Linkerd:

  1. 安装Linkerd CLI

    curl -sL https://run.linkerd.io/install | sh
    export PATH=$PATH:$HOME/.linkerd2/bin
    

  2. 验证安装

    linkerd version
    

  3. 安装Linkerd到Kubernetes集群

    linkerd install | kubectl apply -f -
    

  4. 检查Linkerd的安装

    linkerd check
    

4. 在Java应用中集成Linkerd

在此示例中,我们将创建一个简单的Java微服务应用,并通过Linkerd进行配置。我们将使用Spring Boot构建两个服务:一个是订单服务,另一个是用户服务。

项目结构

microservices-demo/
|-- order-service/
|   |-- src/
|   |-- pom.xml
|-- user-service/
|   |-- src/
|   |-- pom.xml

4.1. 创建用户服务

user-service项目中,我们首先创建一个简单的Spring Boot应用:

<!-- user-service/pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>user-service</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>user-service</name><properties><java.version>11</java.version><spring-boot.version>2.5.4</spring-boot.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

用户服务代码

// user-service/src/main/java/com/example/userservice/UserServiceApplication.java
package com.example.userservice;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@RestController
public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}@GetMapping("/users")public String getUsers() {return "User list";}
}

4.2. 创建订单服务

order-service项目中,创建一个类似的Spring Boot应用:

<!-- order-service/pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>order-service</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>order-service</name><properties><java.version>11</java.version><spring-boot.version>2.5.4</spring-boot.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

订单服务代码

// order-service/src/main/java/com/example/orderservice/OrderServiceApplication.java
package com.example.orderservice;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
@RestController
public class OrderServiceApplication {private final RestTemplate restTemplate;public OrderServiceApplication(RestTemplate restTemplate) {this.restTemplate = restTemplate;}public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}@GetMapping("/orders")public String getOrders() {String users = restTemplate.getForObject("http://user-service/users", String.class);return "Order list. " + users;}
}

4.3. 配置RestTemplate

为了让订单服务能够调用用户服务,我们需要使得RestTemplate能够通过Linkerd发现服务。我们需要在order-service中添加配置:

// order-service/src/main/java/com/example/orderservice/Config.java
package com.example.orderservice;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class Config {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
5. 创建Kubernetes部署文件

现在,我们需要为这两个服务创建Kubernetes部署文件。

用户服务部署

# user-service-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: user-service
spec:replicas: 1selector:matchLabels:app: user-servicetemplate:metadata:labels:app: user-servicespec:containers:- name: user-serviceimage: yourdockerhub/user-service:latestports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: user-service
spec:ports:- port: 8080targetPort: 8080selector:app: user-service

订单服务部署

# order-service-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: order-service
spec:replicas: 1selector:matchLabels:app: order-servicetemplate:metadata:labels:app: order-servicespec:containers:- name: order-serviceimage: yourdockerhub/order-service:latestports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: order-service
spec:ports:- port: 8080targetPort: 8080selector:app: order-service
6. 部署到Kubernetes

使用以下命令在Kubernetes中部署服务:

kubectl apply -f user-service-deployment.yaml
kubectl apply -f order-service-deployment.yaml
7. 在Linkerd中注入代理

Linkerd提供了自动注入代理的功能,可以将Linkerd代理注入到Kubernetes中的每个Pod中,确保服务间通信通过Linkerd进行。

kubectl get ns
kubectl annotate namespace default linkerd.io/inject=enabled

对于已经部署的服务,可以手动将Linkerd代理注入:

kubectl get deploy -o name | xargs -n 1 linkerd inject | kubectl apply -f -
8. 监控Linkerd

Linkerd提供了强大的监控功能,可以通过其提供的仪表板进行观察:

linkerd dashboard

通过这条命令,您可以访问Linkerd的Web仪表板,并实时监控服务的性能指标。

9. 结论

在本文中,我们详细介绍了如何使用Linkerd进行服务网格的配置与监控,并通过Java代码示例展示如何集成Linkerd到微服务中。Linkerd不仅可以增强服务间的通信安全性和可靠性,还提供了监控和可视化的能力,帮助开发者更好地管理微服务架构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试题:MySQL 索引

1. 谈一下你对于MySQL索引的理解?(为什么MySQL要选择B+树来存储索引) MySQL的索引选择B+树作为数据结构来进行存储,使用B+树的本质原因在于可以减少IO次数,提高查询的效率,简单来说就是可以保证在树的高度不变的情况下存储更多的数据: IO效率的提高:在MySQL数据库中,…

E19.【C语言】练习:数组

有序序列合并 描述 输入两个升序排列的序列&#xff0c;将两个序列合并为一个有序序列并输出。 数据范围&#xff1a; 1≤n,m≤1000 &#xff0c; 序列中的值满足 0≤val≤30000 输入描述&#xff1a; 输入包含三行&#xff0c; 第一行包含两个正整数n, m&#xff0c;用空…

大模型的经典面试问题及答案

大语言模型&#xff08;LLM&#xff09;在人工智能中变得越来越重要&#xff0c;在各个行业都有应用。随着对大语言模型专业人才需求的增长&#xff0c;本文提供了一套全面的面试问题和答案&#xff0c;涵盖了基本概念、先进技术和实际应用。如果你正在为面试做准备&#xff0c…

ABB机器人EGM功能简单应用

EGM中使用的是Protocol Buffer2的协议&#xff0c;从Egm.proto模板文件中可以了解到&#xff0c;协议版本没有定义默认为proto2&#xff0c;目前最新版本为proto3。PC安装了RobotStudio 6.08后&#xff0c;在如下路径可以找到egm.proto模板文件。 C:\ProgramData\ABB Industri…

ISP-LSC

1. 概述 Lens shading分为两个部分&#xff0c;亮度均匀性&#xff08;luma shading correction&#xff09;&#xff0c;色彩均匀性&#xff08;colour shading correction&#xff09;。 lens 的各位置和中心的透射率不同&#xff1a;luma shading lens 对不同光谱的shift 不…

11. kubernetes资源——configmap配置映射

kubernetes资源——configmap配置映射 一、configmap配置映射1、创建configMap&#xff0c; 存MySQL配置2、创建MySQL pod 一、configmap配置映射 存放配置文件内容 1、创建configMap&#xff0c; 存MySQL配置 apiVersion: v1 kind: ConfigMap metadata:name: test-mysql-co…

NOILinux2.0安装

NOI官方已发布NOILinux2.0&#xff0c;可是如何安装使用呢&#xff1f;我来教你。 首先下载VMWare和NOILinux2.0的ios&#xff0c;当然你用什么虚拟机软件都可以。这里我用的是VMware。 NOIlinux2.0的下载链接&#xff1a; NOI Linux 2.0发布&#xff0c;将于9月1日起正式启用…

Cesium 体积云效果

Cesium 体积云效果&#xff08;局部&#xff09; 原理&#xff1a;RayMarching光线步进噪声&#xff0c;需要修改源码让cesium支持3D纹理&#xff08;texImage3D&#xff09; 源码修改思路&#xff1a;Cesium中使用Sampler3D&#xff0c;3D纹理&#xff0c;实现体渲染 感谢思…

Debian12 安装Docker 用 Docker Compose 部署WordPress

服务器准备&#xff1a; 以root账号登录&#xff0c;如果不是root&#xff0c;后面指令需要加sudo apt update apt install apt-transport-https ca-certificates curl gnupg lsb-release添加GPG密钥&#xff0c;推荐国内源 curl -fsSL https://mirrors.aliyun.com/docker…

图的遍历:深度优先搜索(DFS)

引言 图遍历是指按照一定的顺序访问图中的每个顶点。遍历图的两种主要方法是深度优先搜索&#xff08;Depth-First Search, DFS&#xff09;和广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;。本文将详细介绍深度优先搜索的定义、算法及其实现。 深度优先搜…

【Sklearn-驯化】一文搞懂很难的条件随机场系列算法:hmm、crf以及实践

【Sklearn-驯化】一文搞懂很难的条件随机场系列算法&#xff1a;hmm、crf以及实践 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相…

【Python从入门到进阶】61、Pandas中DataFrame对象的操作(二)

接上篇《60、Pandas中DataFrame对象的操作&#xff08;一&#xff09;》 上一篇我们讲解了DataFrame对象的简介、基本操作及数据清洗相关的内容。本篇我们来继续讲解DataFrame对象的统计分析、可视化以及数据导出与保存相关内容。 一、DataFrame的统计分析 在数据分析和处理中…

C#与欧姆龙PLC 通信——fins udp协议

前言 欧姆龙PLC在工控领域占有很大的市场份额,在上位机编程领域,实现上位机和欧姆龙PLC的通信也是必备的技能,上位机和PLC可以通过fins udp和fins tcp协议通信,本文介绍的是fins udp协议,该协议具有传输速度快的特点,为了帮助大家学习fins udp协议,我编写了“欧姆龙Fin…

从零开始学习网络安全渗透测试之基础入门篇——(四)反弹SHELL不回显带外正反向连接防火墙出入站文件上传下载

一、反弹SHELL 反弹SHELL&#xff08;Reverse Shell&#xff09;是一种网络攻击技术&#xff0c;它允许攻击者在一个被入侵的计算机上执行命令&#xff0c;即使该计算机位于防火墙或NAT&#xff08;网络地址转换&#xff09;之后。通常&#xff0c;当攻击者无法直接连接到目标…

堡垒机介绍

堡垒机&#xff0c;也被称为跳板机、跳板服务器或堡垒服务器&#xff0c;是一种网络安全设备&#xff0c;它在网络安全领域扮演着重要角色。以下是关于堡垒机的详细解析&#xff1a; 一、定义与功能 定义&#xff1a;堡垒机是一种用于控制和管理网络安全的重要工具&#xff0…

不要对数组使用多态

类继承的最重要的特性是你可以通过基类指针或引用来操作派生类。这样的指针或引用具有行为的多态性&#xff0c;就好像它们同时具有多种形态。C允许你通过基类指针和引用来操作派生类数组。不过这根本就不是一个特性&#xff0c;因为这样的代码几乎从不如你所愿地那样运行。 假…

基于OPENMV实现一个单目测速测试

1、测试平台&#xff1a;OpenMV4H7Plus开发板​ 使用的相机是 MT9V034 相机对应为752x480黑白图像&#xff0c;为全局快门 2、测速的时候&#xff0c;仅选取最大物体的抓取&#xff0c;这里采用了几个步骤&#xff1a; ①、直接计算灰度的帧差 ②、对帧差进行阈值处理以获取mot…

【代码随想录训练营第42期 Day7打卡 LeetCode 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

目录 一、做题心得 二、题目及题解 454.四数相加II 题目链接 题解 383. 赎金信 题目链接 题解 15. 三数之和 题目链接 题解 18. 四数之和 题目链接 题解 三、小结 一、做题心得 今天是代码随想录训练营打卡的第七天&#xff0c;做的也是同昨天一样的哈希表部分…

CUDA编程之grid和block详解

CUDA 文章目录 CUDAgrid和block基本的理解1维 遍历2维 遍历3维 遍历3维 打印对应的thread grid和block基本的理解 Kernel&#xff1a;Kernel不是CPU&#xff0c;而是在GPU上运行的特殊函数。你可以把Kernel想象成GPU上并行执行的任务。当你从主机&#xff08;CPU&#xff09;调…

使用Chainlit接入通义千问快速实现一个多模态的对话应用

开通灵识服务 首先需要到阿里云-模型服务灵积开通账户&#xff0c;获得apiKey 模型服务灵积 https://dashscope.aliyun.com/ 进入控制台 &#xff0c;在API-KEY管理里&#xff0c;创建一个新的API-KEY,然后保存起来&#xff0c;后面会用到。 模型服务灵积服务所有API文档地址…