SpringCloud服务通信

news2024/11/15 8:55:41

目录

Ribbon实现服务通信

创建工程product-basic-provider(提供者)

创建工程product-img-provider(提供者)

创建工程product-detail-api(消费者)

OpenFeign实现服务通信

创建工程product-detail-api-feign(消费者)


Ribbon实现服务通信

服务提供者:product-basic-provider、product-img-provider

服务消费者:product-detail-api

创建工程product-basic-provider(提供者)

controller 


@RestController
@RequestMapping("/product-basic")
public class ProductBasicController {

    @GetMapping("/get")
    public Product get(String productId){
        Product product = new Product(productId,"娃哈哈","好喝不贵!");
        return product;
    }

    @DeleteMapping("/delete/{id}")
    public Product delete(@PathVariable("id") String productId){
        return product;
    }

    @PostMapping("/add")
    public Product add(@RequestBody Product product){
        return product;
    }

    @PostMapping("/check")
    public User check(@RequestBody User user){
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
        return user;
    }

    //测试feign get请求传参
    @GetMapping("/test")
    public Product test(Product product){
        System.out.println(product);
        return product;
    }
}

 实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {
    private String productId;
    private String productName;
    private String productDesc;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String username;
    private String password;
}

启动类 

@SpringBootApplication
@EnableDiscoveryClient//开启服务注册与发现
public class ProductBasicProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductBasicProviderApplication.class, args);
    }
}
application.yml
server:
  port: 9001
spring:
  application:
    name: product-basic-provider  #指定当前服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #nacos服务器地址
        username: nacos
        password: nacos

创建工程product-img-provider(提供者)

 

controller 

@RestController
@RequestMapping("/product-img")
public class ProductImgController {

    @GetMapping("/getImg")
    public List<ProductImg> listImgByProductId(String productId){
        List<ProductImg> imgList = new ArrayList<>();
        //假数据
        imgList.add(new ProductImg("1",productId,"http:ip//img/a.jpg"));
        imgList.add(new ProductImg("2",productId,"http:ip//img/b.jpg"));
        imgList.add(new ProductImg("3",productId,"http:ip//img/c.jpg"));
        imgList.add(new ProductImg("4",productId,"http:ip//img/d.jpg"));
        return imgList;
    }
}

 实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProductImg {
    private String imgId;
    private String productId;
    private String imgUrl;
}

启动类 

@SpringBootApplication
@EnableDiscoveryClient
public class ProductImgProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductImgProviderApplication.class, args);

    }

}
application.yml
server:
  port: 9002
spring:
  application:
    name: product-img-provider  #指定当前服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #nacos服务器地址
        username: nacos
        password: nacos

创建工程product-detail-api(消费者)

Ribbon配置 

@Configuration
public class RibbonClientConfig {
    @Bean
    //RestTemplate发送请求都要通过ribbon去(nacos注册中心)获取服务实例列表
    @LoadBalanced //启动ribbon组件(负载均衡组件)
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

controller 

@RestController
@RequestMapping("/product-api")
@CrossOrigin//开启允许跨域
public class ProductDetailController {

    @Autowired
    private ProductDetailService productDetailService;

    @GetMapping("/get/{id}")
    public ResultVo getProductDetail(@PathVariable("id") String productId){
        return productDetailService.getProduct(productId);
    }
}

实体类 

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResultVo<T> {
    private Integer code;
    private String msg;
    private T data;
}

service接口 

public interface ProductDetailService {
    public ResultVo getProduct(String productId);
}

实现类 

@Service
public class ProductDetailServiceImpl implements ProductDetailService {

    @Autowired
    private RestTemplate restTemplate;

    @Override
    public ResultVo getProduct(String productId) {

        //1、调用product-basic-provider查询商品基本信息
        String url = "http://product-basic-provider/product-basic/get?productId=" + productId;
//        Product product = restTemplate.getForObject(url, Product.class);

        String url3 = "http://product-basic-provider/product-basic/delete/" + productId;
//        restTemplate.delete(url3);

        String url4 = "http://product-basic-provider/product-basic/add";
//        ResponseEntity<Product> product1 = restTemplate.postForEntity(url4, "obj", Product.class);

        String url5 = "http://product-basic-provider/product-basic/check";
        User user= restTemplate.patchForObject(url5, new User("admin", "123456"), User.class);

        // 2、调用product-img-provider查询商品图片信息
        String url2 = "http://product-img-provider/product-img/getImg?productId=" + productId;
//        List<ProductImg>  productImgs= restTemplate.getForObject(url2,List.class);

        return new ResultVo(0,"success",user);
    }
}

启动类 

@SpringBootApplication
@EnableDiscoveryClient
public class ProductDetailApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductDetailApiApplication.class, args);
    }
}
application.yml
server:
  port: 8001
spring:
  application:
    name: product-detail-api  #指定当前服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #nacos服务器地址
        username: nacos
        password: nacos

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.green</groupId>
    <artifactId>product-detail-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>product-detail-api</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
    </properties>
    <dependencies>
        
        <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>
            <version>2.2.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </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>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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.green.productdetailapi.ProductDetailApiApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

启动服务 

使用postma测试 

http://localhost:8001/product-api/get/1

返回结果:
{
    "code": 0,
    "msg": "success",
    "data": {
        "username": "admin",
        "password": "123456"
    }
}

 

 

 

OpenFeign实现服务通信

服务提供者:product-basic-provider、product-img-provider

服务消费者:product-detail-api-feign

创建工程product-detail-api-feign(消费者)

 

ProductBasicClient
@FeignClient("product-basic-provider")
public interface ProductBasicClient {

    @GetMapping("/product-basic/get")
    public Product get(@RequestParam("productId") String productId);

    @DeleteMapping("/product-basic/delete/{id}")
    public Product delete(@PathVariable("id") String productId);

    @PostMapping("/product-basic/add")
    public Product add(@RequestBody Product product);

    @PostMapping("/product-basic/check")
    public User check(User user);

    //测试feign get请求传参
    @GetMapping("/product-basic/test")
    public Product test(@RequestParam("productId") String productId,@RequestParam("productName") String productName);
}
ProductImgClient
@FeignClient("product-img-provider")
public interface ProductImgClient {

    @GetMapping("/product-img/getImg")
    public List<ProductImg> listImgByProductId(@RequestParam("productId") String productId);
}

ProductDetailServiceImpl实现类
@Service
public class ProductDetailServiceImpl implements ProductDetailService {

    @Autowired
    private ProductBasicClient productBasicClient;

    @Autowired
    private ProductImgClient productImgClient;

    @Override
    public ResultVo getProduct(String productId) {

        //1、调用product-basic-provider查询商品基本信息
        Product product = productBasicClient.get(productId);

        // 2、调用product-img-provider查询商品图片信息
        List<ProductImg> productImgs = productImgClient.listImgByProductId(productId);
        product.setProductImgList(productImgs);

        return new ResultVo(0,"success",product);
    }
}
application.yml
server:
  port: 8002
spring:
  application:
    name: product-detail-api-feign  #指定当前服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #nacos服务器地址
        username: nacos
        password: nacos

使用postma测试 

http://localhost:8002/product-api/get/1

测试结果:
{
    "code": 0,
    "msg": "success",
    "data": {
        "productId": "1",
        "productName": "娃哈哈",
        "productDesc": "好喝不贵!",
        "productImgList": [
            {
                "imgId": "1",
                "productId": "1",
                "imgUrl": "http:ip//img/a.jpg"
            },
            {
                "imgId": "2",
                "productId": "1",
                "imgUrl": "http:ip//img/b.jpg"
            },
            {
                "imgId": "3",
                "productId": "1",
                "imgUrl": "http:ip//img/c.jpg"
            },
            {
                "imgId": "4",
                "productId": "1",
                "imgUrl": "http:ip//img/d.jpg"
            }
        ]
    }
}

 

 

 

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

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

相关文章

关于Ubuntu下docker-mysql:ERROR 2002报错

报错场景&#xff1a; mysql容器创建好后登录mysql时即使密码正确也是报出下方提示&#xff1a; 原因是在创建mysql容器在创建时本地目录缺失&#xff0c; 先去自建一个目录&#xff0c;例如&#xff1a; /opt/my_sql 正确完整目录如下&#xff1a; docker run --namemys…

EasyCVR视频融合平台如何助力执法记录仪高效使用

旭帆科技的EasyCVR平台可接入的设备除了常见的智能分析网关与摄像头以外 &#xff0c;还可通过GB28181协议接入执法记录仪&#xff0c;实现对执法过程的全称监控与录像&#xff0c;并对执法轨迹与路径进行调阅回看。那么&#xff0c;如何做到执法记录仪高效使用呢&#xff1f; …

20240202在Ubuntu20.04.6下配置环境变量之后让nvcc --version显示正常

20240202在Ubuntu20.04.6下配置环境变量之后让nvcc --version显示正常 2024/2/2 20:19 在Ubuntu20.04.6下编译whiper.cpp的显卡模式的时候&#xff0c;报告nvcc异常了&#xff01; 百度&#xff1a;nvcc -v nvidia-cuda-toolkit rootrootrootroot-X99-Turbo:~/whisper.cpp$ WH…

【Python基础】matplotlib 使用指南

文章目录 matplotlib 使用指南1 matplotlib安装与基本介绍1.1 %matplotlib inline1.2 认识matplotlib图表 2 matplotlib基本使用2.1 参数2.2格式配置2.3设置x与y轴2.4 字体设置2.5 title/图例设置2.6 子图2.7 创建画布2.8 设置坐标轴 3 matplotlib常用的图表3.1 折线图3.1 散点…

vue3、vue2以及非vue项目中拖拽改变dom结构以及数组顺序 vuedraggable

文章目录 vue3、vue2以及非vue项目中拖拽改变dom结构以及数组顺序先看效果属性名称 说明具体代码 vue3、vue2以及非vue项目中拖拽改变dom结构以及数组顺序 参考链接&#xff0c;这个还有其他库的教程&#xff0c;可以收藏的 展示效果 github地址 vue.draggable.next 是一款vu…

如何使用 ZoomEye 搜索引擎保姆级教程(附链接)

一、介绍 ZoomEye&#xff08;中文名&#xff1a;钟馗之眼&#xff09;是一款专注于网络设备和物联网设备搜索的搜索引擎。它提供了一种通过互联网上的设备进行搜索的方式&#xff0c;使用户能够发现和分析各种连接到互联网的设备&#xff0c;包括服务器、路由器、摄像头、数据…

Linux 网络编程 + 笔记

协议&#xff1a;一组规则 分层模型结构&#xff1a; OSI七层模型&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层TCP/IP 4层模型&#xff1a;链路层/网络接口层、网络层、传输层、应用层 应用层&#xff1a;http、ftp、nfs、ssh、telnet、传输层&am…

【24美赛思路已出】2024年美赛A~F题解题思路已出 | 无偿自提

A题&#xff1a;资源可用性和性别比例 问题一&#xff1a; 涉及当灯鱼种群的性别比例发生变化时&#xff0c;对更大的生态系统产生的影响。为了分析这个问题&#xff0c;可以采用以下的数学建模思路&#xff1a;建立灯鱼种群模型&#xff1a; 首先&#xff0c;建立一个灯鱼种群…

爬虫入门到精通_基础篇4(BeautifulSoup库_解析库,基本使用,标签选择器,标准选择器,CSS选择器)

1 Beautiful说明 BeautifulSoup库是灵活又方便的网页解析库&#xff0c;处理高效&#xff0c;支持多种解析器。利用它不用编写正则表达式即可方便地实线网页信息的提取。 安装 pip3 install beautifulsoup4解析库 解析器使用方法优势劣势Python标准库BeautifulSoup(markup,…

Session与Cookie、部署redis、redis基本操作、Session共享

1 案例1&#xff1a;PHP的本地Session信息 1.1 问题 通过Nginx调度器负载后端两台Web服务器&#xff0c;实现以下目标&#xff1a; 部署Nginx为前台调度服务器调度算法设置为轮询后端为两台LNMP服务器部署测试页面&#xff0c;查看PHP本地的Session信息 1.2 方案 实验拓扑…

亚马逊新店铺视频怎么上传?视频验证失败怎么办?——站斧浏览器

亚马逊新店铺视频怎么上传&#xff1f; 登录亚马逊卖家中心&#xff1a;首先&#xff0c;卖家需要登录亚马逊卖家中心。在登录后&#xff0c;可以点击左侧导航栏上的“库存”选项&#xff0c;然后选择“新增或管理商品”。 选择商品&#xff1a;接下来&#xff0c;在“新增或…

如何部署Node.js服务并实现无公网ip远程访问本地项目【内网穿透】

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

YOLOv8进阶 | 如何用yolov8训练自己的数据集(以安全帽佩戴检测举例)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLOv8是一种目标检测算法&#xff0c;它是YOLO&#xff08;You Only Look Once&#xff09;系列算法的最新版本。本节课就带领大家如何基于YOLOv8来训练自己的目标检测模型&#xff0c;本次作者就以安全帽佩戴检测为案例进…

二叉树的最小深度

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2示例 2&#xff1a; 输入&…

postgres:锁申请

什么是弱锁&#xff0c;强锁&#xff1f; 为了提高并发控制&#xff0c;PG通过将锁信息在本地缓存&#xff08;**LOCALLOCK**&#xff09;和快速处理常见锁&#xff08;fastpath&#xff09;&#xff0c;减少了对共享内存的访问&#xff0c;提高性能。从而出现了弱锁和强锁的概…

如何在win系统部署开源云图床Qchan并无公网ip访问本地存储图片

文章目录 前言1. Qchan网站搭建1.1 Qchan下载和安装1.2 Qchan网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar云端设置2.2 Cpolar本地设置 3. 公网访问测试总结 前言 图床作为云存储的一项重要应用场景&#xff0c;在大量开发人员的努力下&#xff0c;已经开发出大…

【自然语言处理】P2 PyTorch 基础 - 张量

目录 安装 PyTorch张量创建张量操作张量索引、切片、联合操作 CUDA张量 本系列博文我们将使用 PyTorch 来实现深度学习模型等。PyTorch 是一个开源的、社区驱动的深度学习框架。拥有强大的工具和库生态系统&#xff0c;包含 TorchVision&#xff08;用于图像处理&#xff09;、…

后端软件三层架构

一、三层架构简介 三层架构是软件开发中广泛采用的一种经典架构模式&#xff0c;其核心价值在于通过清晰的任务划分来提高代码的可维护性和重用性。具体来说&#xff0c;三层架构主要包括以下三个层次&#xff1a; 持久层&#xff08;DAO层&#xff09;&#xff1a;这一层主要…

和鲸科技与智谱AI达成合作,共建大模型生态基座

近日&#xff0c;上海和今信息科技有限公司&#xff08;简称“和鲸科技”&#xff09;与北京智谱华章科技有限公司&#xff08;简称“智谱AI”&#xff09;签订合作协议&#xff0c;双方将携手推动国产通用大模型的广泛应用与行业渗透&#xff0c;并积极赋能行业伙伴探索领域大…

10:00进去,10:06就出来了,面试问的问题真难。。。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 刚从小厂出来&#xff0c;没想到在另一家公司我又寄了。 在这家…