微服务之间相互调用

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

相关文章

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Idea调用WebService的关键步骤和注意事项

《Idea调用WebService的关键步骤和注意事项》:本文主要介绍如何在Idea中调用WebService,包括理解WebService的基本概念、获取WSDL文件、阅读和理解WSDL文件、选... 目录前言一、理解WebService的基本概念二、获取WSDL文件三、阅读和理解WSDL文件四、选择对接

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点