SpringCloud 远程调用

news2024/11/28 7:50:27

目录

1. SpringCloud 

2. Nacos 

3. 远程通信

3.1 创建公共子模块 (nacos_commons)

3.1.1 DTO对象

3.2 父项目引入子项目 (nacos_commons) 打成的jar包 

3.3 父项目指向子项目 (nacos_commons)   为儿子

3.4 子项目 (nacos_provider) 

3.5 子项目 (nacos_consumer) 

3.6 启动项目测试进行远程调用服务


前言

 熟悉SpringCloud请阅读下篇文章

 SpringCloud 使用与Nacos_JoneClassMate的博客-CSDN博客 


 1. SpringCloud 

2. Nacos 

 

3. 远程通信

  • 就是在互不相干的模块里调用其他模块的接口 

  • 本章内容父项目pom文件结构

<?xml version="1.0" encoding="UTF-8"?>

<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.jmh</groupId>
  <artifactId>springcloud01</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--pom代表这个是个父工程-->
  <packaging>pom</packaging>

  <!--指向儿子-->
  <modules>
    <module>nacos_provider</module>
    <module>nacos_consumer</module>
    <module>nacos_commons</module>
  </modules>

  <name>springcloud01 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <!--提供版本-->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring-boot.version>2.4.1</spring-boot.version>
    <spring-cloud.version>2020.0.0</spring-cloud.version>
    <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
  </properties>

  <!--提供依赖-->
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--注册与发现-->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--远程通信-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!--负载均衡-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-loadbalancer</artifactId>
    </dependency>
    <!--对象赋值依赖-->
    <dependency>
      <groupId>ma.glasnost.orika</groupId>
      <artifactId>orika-core</artifactId>
      <version>1.4.6</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>
    <!--子模块nacos_commons依赖-->
    <dependency>
      <groupId>com.jmh</groupId>
      <artifactId>nacos_commons</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
  </dependencies>

  <!--提供依赖版本-->
  <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>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>${spring-cloud-alibaba.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>


</project>

 3.1 创建公共子模块 (nacos_commons)

        3.1.1 DTO对象

  • VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据 封装起来。
  • DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是 为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的 性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
  • DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
  • PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一 一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应 PO的一个(或若干个)属性。 

 

消费者 远程调用 生产者 : 需要网络传输,使用DTO同一封装对象 

原理与SpringBoot启动类相同

  1.将DTO对象封装到公共DTO模块

  2.为需要的项目引入公共DTO模块

注意点

1.不需要继承父模块(重复引用问题)

2.打包方式为jar

3.不需要添加启动类的编译

 

  • 创建UserDto对象
package com.jmh.nacos_commons.dto;

import lombok.Data;

/**
 * @author 蒋明辉
 * @data 2022/11/4 17:28
 */
@Data
public class UserDto {
    //账号
    private String names;
    //密码
    private String pwd;
    //秘钥
    private String token;
}

  •  打包 点击要打包的项目右键点击Run Maven 选择Install

 

 3.2 父项目引入子项目 (nacos_commons) 打成的jar包 

<!--子模块nacos_commons依赖-->
    <dependency>
      <groupId>com.jmh</groupId>
      <artifactId>nacos_commons</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>

 3.3 父项目指向子项目 (nacos_commons)   为儿子

  •  注意!子项目不需要继承父模块(重复引用问题)
<modules>
    <module>nacos_commons</module>
  </modules>

 3.4 子项目 (nacos_provider) 

 Orika 

 Orika是java Bean映射框架,可以实现从一个对象递归拷贝数据至另一个对象。

  • pojo模块 
package com.jmh.nacos_provider.pojo;

import lombok.Data;

/**
 * @author 蒋明辉
 * @data 2022/11/4 17:28
 */
@Data
public class User {
    //账号
    private String name;
    //密码
    private String pwd;
}
  • 启动类配置 
package com.jmh.nacos_provider;

import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.DefaultMapperFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;

@SpringBootApplication
@EnableDiscoveryClient
@SuppressWarnings("all")
public class NacosProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosProviderApplication.class, args);
    }

    @Bean
    /*单例模式:原型链*/
    @Scope("prototype")
    public MapperFactory mapperFactory() {
        return new DefaultMapperFactory.Builder().build();
    }

}
  •  controller模块
package com.jmh.nacos_provider.controller;

import com.jmh.nacos_commons.dto.UserDto;
import com.jmh.nacos_provider.pojo.User;
import ma.glasnost.orika.MapperFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * @author 蒋明辉
 * @data 2022/11/4 17:29
 */
@RestController
@RequestMapping("/user")
@SuppressWarnings("all")
public class UserController {

    @Autowired
    private MapperFactory factory;

    @RequestMapping("/{name}")
    public String getByPath(@PathVariable("name") String name){
        System.out.println("name=" + name);
        return "我是生产者: yes";
    }

    @RequestMapping("/param")
    public String getByParam(@RequestParam("name") String name,@RequestParam("pwd") String pwd){
        System.out.println("name=" + name);
        System.out.println("pwd=" + pwd);
        return "我是生产者: yes";
    }

    @RequestMapping("/pojo")
    public String getByPojo(@RequestBody UserDto userDto){
        //属性值一样
        //User u = factory.getMapperFacade().map(userDto, User.class);
        //属性值那不一样
        factory.classMap(UserDto.class, User.class)
                .field("names", "name")
                .byDefault().register();
        User u = factory.getMapperFacade().map(userDto, User.class);
        System.out.println("user=" + u);
        return "我是生产者: yes";
    }

    @RequestMapping("/map")
    public String getByMap(@RequestBody Map<String,Object> map){
        System.out.println("map=" + map);
        return "我是生产者: yes";
    }



}

 3.5 子项目 (nacos_consumer) 

现在为什么来了 现在我在互不相干的模块中怎么去调用呢?用什么方法去调用呢? 生产者提供接口:可以使用以下几个注解接收远程调用的参数值:

  • @PathVariable
  • @RequestParam
  • @RequestBody
  • @RestController
  • 启动类配置 
package com.jmh.nacos_consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@SuppressWarnings("all")
public class NacosConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerApplication.class, args);
    }

}
  •  编写远程访问接口
package com.jmh.nacos_consumer.service;

import com.jmh.nacos_commons.dto.UserDto;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * @author 蒋明辉
 * @data 2022/11/4 17:29
 */
@FeignClient("nacos-provider")
@SuppressWarnings("all")
public interface IFeignUserService {

    @RequestMapping("/user/{name}")
    String getByPath(@PathVariable("name") String name);

    @RequestMapping("/user/param")
    String getByParam(@RequestParam("name") String name,@RequestParam("pwd") String pwd);

    @RequestMapping("/user/pojo")
    String getByPojo(@RequestBody UserDto user);

    @RequestMapping("/user/map")
    String getByMap(@RequestBody Map<String,Object> map);



}
  •  controller模块
package com.jmh.nacos_consumer.controller;

import com.jmh.nacos_commons.dto.UserDto;
import com.jmh.nacos_consumer.service.IFeignUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * @author 蒋明辉
 * @data 2022/11/4 18:27
 */
@RestController
@RequestMapping("/user")
@SuppressWarnings("all")
public class UserController {

    @Autowired
    private IFeignUserService service;

    @RequestMapping("/{name}")
    public String test01(@PathVariable("name") String name){
        service.getByPath(name);
        return "我是消费者: yes";
    }

    @RequestMapping("/test02")
    public String test02(String name,String pwd){
        service.getByParam(name,pwd);
        return "我是消费者: yes";
    }

    @RequestMapping("/test03")
    public String test03(@RequestBody UserDto user){
        service.getByPojo(user);
        return "我是消费者: yes";
    }

    @RequestMapping("/test04")
    public String test04(@RequestBody Map map){
        service.getByMap(map);
        return "我是消费者: yes";
    }

    @RequestMapping("/test05")
    public String test05(String name){
        service.getByPath(name);
        return "我是消费者: yes";
    }


}

 3.6 启动项目测试进行远程调用服务

     1.  测试子项目nacos_consumer test01接口

  • 控制台打印 

     2.  测试子项目nacos_consumer test02接口 

  •  控制台打印

    3.  测试子项目nacos_consumer test03接口 

  • 控制台打印 

 

   4.  测试子项目nacos_consumer test04接口   

 

  • 控制台打印 

 

    5.  测试子项目nacos_consumer test04接口   

 

  •  控制台打印

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

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

相关文章

【Netty】九、Netty自定义协议

Netty自定义协议一、Netty自定义协议二、 协议设计三、 协议实现编码&#xff1a;解码&#xff1a;时间轮算法Netty中的时间轮一、Netty自定义协议 公有协议&#xff08;http、tcp&#xff09;、私有协议&#xff08;自己定义的&#xff0c;不是行业标准&#xff09; 我们知道…

[Qt]QMainWindow

目录 1.基本概述 2.菜单栏 3.工具栏 4.状态栏 5.铆接部件 6.中心部件 7.资源文件 &#xff08;1&#xff09;创建菜单栏&#xff0c;及菜单项 (2)创建工具栏 (3)创建锚接部件 (4)创建中心文件 &#xff08;5&#xff09;创建状态栏 1.基本概述 QMainWindow是一个为…

腾讯网关TGW基础原理入门

本文是在组内技术分享的发言稿&#xff0c;主要介绍 TGW 基本原理和架构&#xff0c;同时为了加深理解&#xff0c;会辅助对比 TGW 与 LVS&#xff08;ipvs&#xff09;的异同。 本次分享是偏基础性的 TGW 介绍&#xff0c;不会特别深入技术细节&#xff0c;目的是帮助需要用到…

算法7:迪杰斯特拉算法

目录1. 应用场景-最短路径问题2. 迪杰斯特拉(Dijkstra)算法介绍3. 迪杰斯特拉(Dijkstra)算法过程4. 算法分析过程5. 代码实现1. 应用场景-最短路径问题 看一个应用场景和问题 胜利乡有7个村庄(A, B, C, D, E, F, G) &#xff0c;现在有六个邮差&#xff0c;从G点出发&#xff…

贪吃蛇OneDay

环境 配置git环境 安装Git Bash&#xff08;使用Mac和Linux的同学可以跳过这一步&#xff09;&#xff1a;https://gitforwindows.org/ 进入家目录生成秘钥&#xff1a;执行命令ssh-keygen 在Ac Git上注册账号&#xff0c;地址&#xff1a;https://git.acwing.com/ 将id_rsa.p…

Unity中的AssetBundle

AssetBundle的概念 AssetBundle又称AB包&#xff0c;是Unity提供的一种用于存储资源的资源压缩包&#xff0c;是对Unity 初始Resources的一种扩展&#xff1b;一般使用的策略是把必须的资源和不需要更新的资源放在Resources文件夹下&#xff0c;其他的资源放在AssetBundle下面…

【微信小程序】flex布局

&#x1f3c6;今日学习目标&#xff1a;flex布局 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;20分钟 &#x1f389;专栏系列&#xff1a;微信小程序开发 文章目录前言Flex布局什么是flex&#xff1f;flex-direc…

Hive中内部表、外部表、分区表、分桶表之间的关系

文章目录Hive中内部表、外部表、分区表、分桶表之间的关系1.0&#x1f680;内部表2.0&#x1f440;外部表3.0&#x1fae5;内部表和外部表的差异3.0&#x1f418;分区表4.0&#x1f603;分桶表Hive中内部表、外部表、分区表、分桶表之间的关系 1.0&#x1f680;内部表 内部表&…

HEAD: HEtero-Assists Distillation for Heterogeneous Object Detectors

ECCV 2022 异质辅助蒸馏 Abstract Conventional knowledge distillation (KD) methods for object detection mainly concentrate on homogeneous teacher-student detectors. However, the design of a lightweight detector for deployment is often significantly differ…

计算机毕业设计(附源码)python智能仓储进出货管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

web前端期末大作业:基于HTML+CSS+JavaScript制作我的音乐网站(带设计报告)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【python】都2022年不会还有人不会在电脑桌面上养宠物吧~

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ! 上班枯燥&#xff0c;对着冷冰冰的电脑&#xff0c;相信很多小伙伴即使摸鱼&#xff0c;心情也不愉快。 这时如果有个萌宠能大家进行实时互动&#xff0c;这该有多好呀。再无聊的工作也能增添那么一丝趣味。 今天博主就来给大…

2、Ubuntu下安装Vivado下的下载器驱动 Digilent 版本

简介 在Ubuntu下安装Vivado时&#xff0c;安装工具会提醒你&#xff0c;digilent驱动无法自动安装&#xff0c;需要手动安装&#xff0c;并且让用户参考UG973手册安装。 由于安装驱动很简单&#xff0c;不用麻烦大家去找手册了&#xff0c;这里直接给出安装方法 安装方法 …

【Pytorch Lighting】第 6 章:深度生成模型

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

FPGA HLS 卷积单元 数据类型hls优化约束设置

数据类型 自定义精度整形&#xff1a; ap_int<4> in1, in2; ap_int<8> concat; concat (in1, in2); // in1和in2拼起来&#xff08;按照补码拼起来&#xff09; /* 例子&#xff1a; in1 1, in2 -1 补码&#xff1a; in1 0001 in2 1001 > 11101 > 1…

Spring mvc处理异常

文章目录一、Handler ExceptionResolver处理异常二、ExceptionHandler注解三、重点&#xff1a;添加ExceptionHandler注解方法的形参只能是异常类型四、重点2&#xff1a;捕获所有方法的异常—ControllerAdvice注解五、总结六、ResponseStatusExceptionResolve自定义异常显示页…

[go学习笔记.第十一章.项目案例] 1.家庭收支记账软件项目

一.基本介绍 1.项目开发流程说明 2.项目需求说明 目标: 模拟实现一个基于文本界面的<<家庭记账软件>> 掌握初步的编程技巧和调试技巧 主要涉及以下知识点 : (1).局部变量和基本数据类型 (2).循环语句 (3).分支语句 (4).简单的屏幕输出格式控制 (5).进阶&#xff1…

刷题日记【第九篇】-笔试必刷题【杨辉三角的变形+计算某字符出现的次数+字符串通配符+统计每个月兔子的总数】

下列sql语句中哪条语句可为用户zhangsan分配数据库userdb表userinfo的查询和插入数据权限&#xff08;A&#xff09;。 常用的管理权限的命令为&#xff1a; grant select/insert/update/delete on 数据库名.表名 to 用户名‘该用户允许访问的ip’ 在oracle中&#xff0c;下面哪…

世界上只有一种共识算法,那就是Paxos

分布式系统原理系列目录 分布式系统的麻烦副本与一致性为什么需要一个分布式共识算法世界上只有一种共识算法&#xff0c;那就是PaxosCAP定理&#xff0c;说起来一句话&#xff0c;实际坑不少BASE&#xff0c;可用性高于强一致性分布式事务方案那么多&#xff0c;到底该选哪一…

计算机毕业设计(附源码)python智慧灭火器管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…