SpringCloud服务通信

目录

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"
            }
        ]
    }
}

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 磁盘空间占用率100%的排查

&#x1f4d1;前言 使用 Linux 操作系统时&#xff0c;可能会遇到磁盘空间不足的错误&#xff0c;这种错误通常会导致系统运行缓慢或崩溃。本文将介绍磁盘排查的方法。⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1…

Redis进阶(一):持久化

持久化 何为持久化&#xff1f; MySQL的事务有四个比较核心的特征&#xff1a;原子性、一致性、持久性和隔离性&#xff0c;这里的持久性和持久化说的是一个事&#xff0c;简单来说&#xff0c;数据存储在硬盘上就是持久&#xff0c;存在内存上那就是不持久&#xff08;重启之后…

FANUC机器人示教器的菜单变成了图标,如何改成列表的形式?

FANUC机器人示教器的菜单变成了图标&#xff0c;如何改成列表的形式&#xff1f; 如下图所示&#xff0c;开机后按下MENU菜单键时&#xff0c;发现原来的列表形式变成了菜单图标的形式&#xff0c;同时在按F1-F5键时&#xff0c;提示&#xff1a;HMI模式-键不可用&#xff0c; …

Github处理clone慢的解决方案

Github设置代理clone依然慢的解决方案 1、前提&#xff1a;科学上网 注意&#xff1a; 必须要有科学上网&#xff01;必须要有科学上网&#xff01;必须要有科学上网&#xff01;重要的事情说三遍&#xff1b; 2、http/https方案&#xff08;git clone时使用http&#xff09…

电脑怎么录屏?打造专业级视频内容!

随着科技的进步&#xff0c;电脑已经深入到我们的日常生活和工作中。而在这个数字时代&#xff0c;录制屏幕内容变得日益重要。无论是制作教程、分享游戏技巧&#xff0c;还是记录重要的演示&#xff0c;录屏都是一个不可或缺的功能。可是电脑怎么录屏呢&#xff1f;本文将深入…

LeetCode:138. 随机链表的复制之如何有效copy

自己复制的话&#xff0c;很容易写出来一个时间复杂度O&#xff08;n ^ 2&#xff09; 空O&#xff08;n&#xff09;的做法 我们可以参考基因的复制&#xff0c; 目录 题目&#xff1a; 实现思路&#xff08;基因复制式的copy&#xff09;&#xff1a; 官方快慢指针解法&…

跟着cherno手搓游戏引擎【18】抽象Shader、项目小修改

抽象&#xff1a; Shader.h: #pragma once #include <string>namespace YOTO {class Shader {public:virtual~Shader()default;virtual void Bind()const0;virtual void UnBind()const0;static Shader* Create(const std::string& vertexSrc, const std::string&am…

20240202在Ubuntu20.04.6下使用whisper.cpp的CPU模式

20240202在Ubuntu20.04.6下使用whisper.cpp的CPU模式 2024/2/2 14:15 rootrootrootroot-X99-Turbo:~/whisper.cpp$ ./main -l zh -osrt -m models/ggml-medium.bin chs.wav 在纯CPU模式下&#xff0c;使用medium中等模型&#xff0c;7分钟的中文视频需要851829.69 ms&#xf…

算法学习——华为机考题库2(HJ11 - HJ20)

算法学习——华为机考题库2&#xff08;HJ11 - HJ20&#xff09; HJ11 数字颠倒 描述 输入一个整数&#xff0c;将这个整数以字符串的形式逆序输出 程序不考虑负数的情况&#xff0c;若数字含有0&#xff0c;则逆序形式也含有0&#xff0c;如输入为100&#xff0c;则输出为0…

个人网站如何让搜索引擎收录

当我们花费功夫搭建好个人网站&#xff0c;如何能让搜索引擎搜索到个人网站呢&#xff1f;比如百度&#xff0c;根本百度不到自己网站的内容。这时候就要使用到搜索引擎提供的站点收录功能了&#xff0c;但是点开百度的搜索资源平台&#xff0c;添加自己的站点时&#xff0c;就…

帮管客CRM SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

地理坐标系、空间坐标系、epsg查询网站

坐标系可用范围和详细信息的查询网站 简介 epsg.ruiduobao.com是一个可以查询gdal中所有坐标系信息的网站&#xff0c;可查询到坐标系的基准面、椭球体、中央子午线等相关信息&#xff0c;并对每个坐标系的可用范围在地图中进行了显示。详细信息可以看操作视频&#xff1a; e…

使用D3.js和React绘制动画条形图

摘要: 将条形图分解为独立组件:容器、坐标轴和条形。使用SVG和D3.js绘制这些组件。使用React的callback ref在DOM中渲染它们。 使用D3绘制图表像搭建乐高 使用D3.js绘制图表时,你处理各种独立组件 —— 很像乐高积木。你单独建造组件,然后将它们组装在一起创建最终图表。这适…

Qt 范例阅读: QStateMachine状态机框架 和 SCXML 引擎简单记录(方便后续有需求能想到这两个东西)

一、QStateMachine 简单应用&#xff1a; 实现按钮的文本切换 QStateMachine machine; //定义状态机&#xff08;头文件定义&#xff09;QState *off new QState(); //添加off 状态off->assignProperty(ui->pushButton_2, "text", "Off"); //绑定该…

MacBook安装软件时允许任何来源的软件

MacBook安装软件时允许任何来源的软件 临时设置允许未知来源的app 当下载网上的软件并安装时,会安装失败, 因为MacOS默认只允许安装App Store上的软件 这时可以临时允许安装,如下设置 开启设置—->安全性与隐私—->未知来源的app 这种方式比较安全 设置允许任何来源…

基于WordPress开发微信小程序2:决定开发一个wordpress主题

上一篇&#xff1a;基于WordPress开发微信小程序1&#xff1a;搭建Wordpress-CSDN博客 很快发现一个问题&#xff0c;如果使用别人的主题模板&#xff0c;多多少少存在麻烦&#xff0c;所以一咬牙&#xff0c;决定自己开发一个主题模板&#xff0c;并且开源在gitee上&#xff…

freertos 源码分析二 list链表源码

list.c 一、链表初始化 void vListInitialise( List_t * const pxList ) { pxList->pxIndex ( ListItem_t * ) &…

LabVIEW核能设施监测

LabVIEW核能设施监测 在核能领域&#xff0c;确保设施运行的安全性和效率至关重要。LabVIEW通过与硬件的紧密集成&#xff0c;为高温气冷堆燃料装卸计数系统以及脉冲堆辐射剂量监测与数据管理系统提供了解决方案。这些系统不仅提高了监测和管理的精确度&#xff0c;也保证了核…

pytorch创建tensor

目录 1. 从numpy创建2. 从list创建3. 创建未初始化tensor4. 设置默认tensor创建类型5. rand/rand_like, randint6. randn生成正态分布随机数7. full8. arange/range9. linspace/logspace10. Ones/zeros/eye11. randperm 1. 从numpy创建 2. 从list创建 3. 创建未初始化tensor T…

Fashion MNIST数据集介绍及基于Pytorch下载数据集

Fashion MNIST数据集介绍及基于Pytorch下载数据集 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;Fashion MNIST数据集简介&#x1f333;Fashion MNIST数据集的类别说明Fashion MNIST数据集图片示例 &#x1f333;基于PyTorch下载Fashion MN…