SpringCloud 远程调用
创始人
2024-01-20 06:34:05

目录

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文件结构

4.0.0com.jmhspringcloud011.0-SNAPSHOTpomnacos_providernacos_consumernacos_commonsspringcloud01 Maven Webapphttp://www.example.comUTF-81.71.72.4.12020.0.02021.1org.springframework.bootspring-boot-starter-testorg.springframework.bootspring-boot-starter-webcom.alibaba.cloudspring-cloud-starter-alibaba-nacos-discoveryorg.springframework.cloudspring-cloud-starter-openfeignorg.springframework.cloudspring-cloud-loadbalancerma.glasnost.orikaorika-core1.4.6org.projectlomboklombokcom.jmhnacos_commons0.0.1-SNAPSHOTorg.springframework.bootspring-boot-dependencies${spring-boot.version}pomimportorg.springframework.cloudspring-cloud-dependencies${spring-cloud.version}pomimportcom.alibaba.cloudspring-cloud-alibaba-dependencies${spring-cloud-alibaba.version}pomimport

 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包 

com.jmhnacos_commons0.0.1-SNAPSHOT

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

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

 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 {@Autowiredprivate 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 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 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 {@Autowiredprivate 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接口   

 

  •  控制台打印

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
苁蓉的食用方法 鲜苁蓉的吃法有... 肉苁蓉号称“温而不热,补而不峻,暖而不燥,滑而不泄,故有从容之名。”历来也是传统药食同源的滋补佳品。...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
阳澄湖在哪里哪个省的 阳澄湖是... 点击题目下方苏州生活指南有用 有趣 有态度近期的阳澄湖度很高,3月24日,央视二套《第一时间》直播连...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...