微服务之间相互调用

2024-09-05 08:44
文章标签 服务 调用 之间 相互

本文主要是介绍微服务之间相互调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用RESTful API进行微服务调用

服务A(调用方)

  1. 创建Spring Boot项目
    使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:

    • Spring Web: 用于构建Web应用和RESTful API。
    • Spring Boot DevTools: 提供开发时的热加载功能。
    • Lombok (可选): 简化Java对象的开发。
    • Spring Cloud OpenFeign: 用于简化HTTP客户端调用。
  2. 配置文件application.properties
    配置服务器端口。

    server.port=8080
    
  3. 定义Feign客户端
    Feign是一个声明式HTTP客户端,可以简化RESTful服务的调用。这里定义了一个接口ServiceBClient,用于调用服务B的API。

    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;// 定义Feign客户端,用于调用服务B的API
    @FeignClient(name = "service-b", url = "http://localhost:8081")
    public interface ServiceBClient {// 声明一个GET请求方法,映射到服务B的API@GetMapping("/api/data/{id}")String getDataById(@PathVariable("id") String id);
    }
    
  4. 创建控制器
    这个控制器包含一个RESTful端点,用于接收来自客户端的请求,并通过ServiceBClient调用服务B的API。

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;@RestController
    public class ServiceAController {@Autowiredprivate ServiceBClient serviceBClient;  // 注入Feign客户端// 定义一个GET请求方法,调用服务B的API并返回结果@GetMapping("/service-a/data/{id}")public String getDataFromServiceB(@PathVariable String id) {return serviceBClient.getDataById(id);}
    }
    
  5. 启动类
    启动Spring Boot应用并启用Feign客户端。

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
    @EnableFeignClients  // 启用Feign客户端
    public class ServiceAApplication {public static void main(String[] args) {SpringApplication.run(ServiceAApplication.class, args);  // 启动应用}
    }
    

服务B(被调用方)

  1. 创建Spring Boot项目
    使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:

    • Spring Web: 用于构建Web应用和RESTful API。
    • Spring Boot DevTools: 提供开发时的热加载功能。
    • Lombok (可选): 简化Java对象的开发。
  2. 配置文件application.properties
    配置服务器端口。

    server.port=8081
    
  3. 创建控制器
    这个控制器包含一个RESTful端点,用于接收来自服务A的请求,并返回相应的数据。

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;@RestController
    public class ServiceBController {// 定义一个GET请求方法,返回ID对应的数据@GetMapping("/api/data/{id}")public String getData(@PathVariable String id) {return "Data from Service B with ID: " + id;}
    }
    
  4. 启动类
    启动Spring Boot应用。

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
    public class ServiceBApplication {public static void main(String[] args) {SpringApplication.run(ServiceBApplication.class, args);  // 启动应用}
    }
    

使用gRPC进行微服务调用

服务A(调用方)

  1. 创建Spring Boot项目
    使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:

    • Spring Boot DevTools: 提供开发时的热加载功能。
    • Spring Boot Starter: 提供Spring Boot核心依赖。
    • gRPC Starter: 提供gRPC支持。
  2. 生成gRPC代码
    定义.proto文件并使用protoc编译生成Java代码。

    syntax = "proto3";package com.example.grpc;// 定义gRPC服务
    service DataService {// 定义一个RPC方法rpc GetData (DataRequest) returns (DataResponse);
    }// 定义请求消息
    message DataRequest {string id = 1;
    }// 定义响应消息
    message DataResponse {string data = 1;
    }
    
  3. 创建gRPC客户端
    这个服务类包含一个gRPC客户端,用于连接到服务B并调用其方法。

    import com.example.grpc.DataServiceGrpc;
    import com.example.grpc.DataRequest;
    import com.example.grpc.DataResponse;
    import io.grpc.ManagedChannel;
    import io.grpc.ManagedChannelBuilder;
    import org.springframework.stereotype.Service;@Service
    public class GrpcClientService {private final DataServiceGrpc.DataServiceBlockingStub stub;public GrpcClientService() {// 创建一个gRPC通道,连接到服务BManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 9090).usePlaintext().build();// 创建一个阻塞式的gRPC客户端stub = DataServiceGrpc.newBlockingStub(channel);}// 调用服务B的gRPC方法public String getData(String id) {DataRequest request = DataRequest.newBuilder().setId(id).build();DataResponse response = stub.getData(request);return response.getData();}
    }
    
  4. 创建控制器
    这个控制器包含一个RESTful端点,用于接收来自客户端的请求,并通过GrpcClientService调用服务B的gRPC服务。

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;@RestController
    public class ServiceAController {@Autowiredprivate GrpcClientService grpcClientService;  // 注入gRPC客户端服务// 定义一个GET请求方法,调用服务B的gRPC方法并返回结果@GetMapping("/service-a/data/{id}")public String getDataFromServiceB(@PathVariable String id) {return grpcClientService.getData(id);}
    }
    
  5. 启动类
    启动Spring Boot应用。

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
    public class ServiceAApplication {public static void main(String[] args) {SpringApplication.run(ServiceAApplication.class, args);  // 启动应用}
    }
    

服务B(被调用方)

  1. 创建Spring Boot项目
    使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:

    • Spring Boot DevTools: 提供开发时的热加载功能。
    • Spring Boot Starter: 提供Spring Boot核心依赖。
    • gRPC Starter: 提供gRPC支持。
  2. 生成gRPC代码
    定义.proto文件并使用protoc编译生成Java代码(同上)。

  3. 实现gRPC服务
    这个服务类实现了gRPC服务,处理来自服务A的请求并返回响应数据。

    import com.example.grpc.DataServiceGrpc;
    import com.example.grpc.DataRequest;
    import com.example.grpc.DataResponse;
    import io.grpc.stub.StreamObserver;
    import net.devh.boot.grpc.server.service.GrpcService;@GrpcService
    public class GrpcDataService extends DataServiceGrpc.DataServiceImplBase {// 实现gRPC服务的方法@Overridepublic void getData(DataRequest request, StreamObserver<DataResponse> responseObserver) {String id = request.getId();DataResponse response = DataResponse.newBuilder().setData("Data from Service B with ID: " + id).build();// 返回响应数据responseObserver.onNext(response);responseObserver.onCompleted();}
    }
    
  4. 启动类
    启动Spring Boot应用。

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
    public class ServiceBApplication {public static void main(String[] args) {SpringApplication.run(ServiceBApplication.class, args);  // 启动应用}
    }
    

优点和适用场景:

  • RESTful API

    • 易于理解和使用。
    • 广泛支持各种客户端和工具。
    • 适合简单的请求/响应模式。
  • gRPC

    • 高性能、低延迟。
    • 支持多种语言。
    • 适合需要高效通信的场景,尤其是需要双向流和复杂数据交换的场景。

这篇关于微服务之间相互调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138482

相关文章

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET