当前位置: 首页 > wzjs >正文

公司网站怎么做推广win11优化大师

公司网站怎么做推广,win11优化大师,青岛市北区核酸检测,个人网站推广渠道 微博 贴吧OpenFeign 微服务之间的通信方式,通常有两种:RPC 和 HTTP。 简言之,RPC 就是像调用本地方法一样调用远程方法。 在 SpringCloud 中,默认是使用 HTTP 来进行微服务的通信,最常用的实现形式有两种: RestTem…

OpenFeign

微服务之间的通信方式,通常有两种:RPC 和 HTTP。

简言之,RPC 就是像调用本地方法一样调用远程方法。

在 SpringCloud 中,默认是使用 HTTP 来进行微服务的通信,最常用的实现形式有两种:

  • RestTemplate
  • OpenFeigen

什么是 OpenFeign

OpenFeign 是一个声明式的 Web Service 客户端。它让微服务之间的调用变得更简单。

SpringCloud Feign 文档:Spring Cloud OpenFeign

OpenFeign 使用

引入依赖

给调用者添加如下依赖

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

添加注解

给调用者的启动类上添加 @EnableFeignClients

image-20250317203705295

编写客户端

@FeignClient 用来指定访问的是哪个服务,value 值表示要访问的应用名称。

image-20250317205409654

@FeignClient 中的 path = “/product” 表示在这个 ProductApi 接口的所有方法中,都会存在前缀 /product

image-20250317205901774

更改调用代码:

import com.demo.order.api.ProductApi;
import com.demo.order.mapper.OrderMapper;
import com.demo.order.model.OrderInfo;
import com.demo.order.model.ProductInfo;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;/*** @author hanzishuai* @date 2025/03/07 19:19* @Description*/
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate ProductApi productApi;/*** Created by hanzishuai on 2025/3/17* @Description: 远程调用 getProductInfo 接口,获取商品信息* @param orderId 商品 ID* @return: */public OrderInfo selectOrderById(Integer orderId) {OrderInfo orderInfo = orderMapper.selectOrderById(orderId);// 更改之前的调用过程// String url = "http://product-service/product/" + orderInfo.getProductId();// ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);// 更改后的调用过程ProductInfo productInfo = productApi.getProductInfo(orderInfo.getProductId());orderInfo.setProductInfo(productInfo);return orderInfo;}
}

参数传递

传递单个参数

使用 @RequestParam 来指定参数,@RequestParam 不可省略。

package com.demo.order.api;import com.demo.order.model.ProductInfo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;// @FeignClient 用来指定访问的是哪个服务,value 表示要访问的应用名称。
// path = "/product" 表示在这个 ProductApi 接口的所有方法中,都会存在前缀 /product
@FeignClient(value = "product-service",path = "/product")
public interface ProductApi {// @RequestMapping 用来指定要访问哪个 URL@RequestMapping("/p1")// 使用 @RequestParam 来指定参数,@RequestParam 不可省略。String p1(@RequestParam("id") Integer id);}

通过 Controller 调用远程方法:

package com.demo.order.controller;import com.demo.order.api.ProductApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/feign")
@RestController
public class FeignController {@Autowiredprivate ProductApi productApi;/*** Created by hanzishuai on 2025/3/17* @Description: 通过远程调用,访问商品服务 p1 方法*/@RequestMapping("/o1")public String o1(Integer id) {return productApi.p1(id);}
}

测试结果:

image-20250317214959882

传递多个参数
package com.demo.order.api;import com.demo.order.model.ProductInfo;
import org.springframework.cloud.openfeign.FeignClient;
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.RequestParam;// @FeignClient 用来指定访问的是哪个服务,value 表示要访问的应用名称。
// path = "/product" 表示在这个 ProductApi 接口的所有方法中,都会存在前缀 /product
@FeignClient(value = "product-service", path = "/product")
public interface ProductApi {// 使用 @RequestParam 来指定参数,@RequestParam 不可省略。@RequestMapping("/p2")String p2(@RequestParam("id") Integer id, @RequestParam("name") String name);}

通过 Controller 调用远程方法同上,就不写了。

传递对象
package com.demo.order.api;import com.demo.order.model.ProductInfo;
import org.springframework.cloud.openfeign.FeignClient;
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.RequestParam;// @FeignClient 用来指定访问的是哪个服务,value 表示要访问的应用名称。
// path = "/product" 表示在这个 ProductApi 接口的所有方法中,都会存在前缀 /product
@FeignClient(value = "product-service", path = "/product")
public interface ProductApi {// @SpringQueryMap 用来接受对象@RequestMapping("/p3")String p3(@SpringQueryMap ProductInfo productInfo);}

通过 Controller 调用远程方法同上,就不写了。

传递 JSON
package com.demo.order.api;import com.demo.order.model.ProductInfo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
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.RequestParam;// @FeignClient 用来指定访问的是哪个服务,value 表示要访问的应用名称。
// path = "/product" 表示在这个 ProductApi 接口的所有方法中,都会存在前缀 /product
@FeignClient(value = "product-service", path = "/product")
public interface ProductApi {@RequestMapping("/p4")String p4(@RequestBody ProductInfo productInfo);
}

通过 Controller 调用远程方法同上,就不写了。

OpenFeign 最佳实践

继承

我们可以定义好一个接口,服务提供方实现这个接口,服务消费方编写 Feign 接口的时候,直接继承这个接口。

官方介绍:Spring Cloud OpenFeign Features :: Spring Cloud Openfeign

接口可以放在一个公共的 jar 包内,供服务提供方和服务消费方使用。

举个例子:假设 order-service 需要调用 product-service 。

  1. 我们可以新建一个 product-api ,把常用的操作封装到接口里。
package com.demo.product.api;import com.demo.product.model.ProductInfo;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;public interface ProductInterface {// @RequestMapping 用来指定要访问哪个 URL@RequestMapping("/{productId}")ProductInfo getProductById(@PathVariable("productId") Integer productId);}
  1. 把当前 jar 包放到本地的 maven 仓库:

image-20250318145322359

  1. 让 order-service、product-service 引入 刚刚打好的 jar 包。

image-20250318145934539

  1. 继承 product-api 的接口:
package com.demo.product.controller;import com.demo.product.api.ProductInterface;
import com.demo.product.model.ProductInfo;
import com.demo.product.service.ProductService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RequestMapping("/product")
@RestController
public class ProductController implements ProductInterface {@Autowiredprivate ProductService productService;@RequestMapping("/{productId}")public ProductInfo getProductById(@PathVariable Integer productId) {log.info("接收参数,productId:" + productId);return productService.selectProductById(productId);}}
抽取

将 Feign 的 Client 抽取为一个独立的模块,并把涉及到的实体类等都放在这个模块中,打成一个 jar。服务消费方只需要依赖该 jar 包即可。jar 包通常由服务提供方来实现。

举个例子:假设 order-service 需要调用 product-service 。

  1. 我们可以新建一个 product-api ,把常用的操作封装到接口里。
package com.demo.product.api;import com.demo.product.model.ProductInfo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;@FeignClient(value = "product-service",path = "/product")
public interface ProductApi {@RequestMapping("/{productId}")ProductInfo getProductById(@PathVariable("productId") Integer productId);}
  1. 把当前 jar 包放到本地的 maven 仓库:

image-20250318145322359

  1. 让 order-service、product-service 引入 刚刚打好的 jar 包。

image-20250318145934539

  1. 由于 Spring 只会扫描启动类下面的目录,而我们要使用的 api 不在启动类下面。所以需要使用@EnableFeignClients(clients = {ProductApi.class}) 来让 Spring 帮我们管理。

    package com.demo.order;import com.demo.product.api.ProductApi;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.openfeign.EnableFeignClients;/*** @author hanzishuai* @date 2025/03/07 17:30*/
    @EnableFeignClients(clients = {ProductApi.class})
    @SpringBootApplication
    public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
    }
  2. 服务调用方引入抽取出来的模块

package com.demo.product.controller;import com.demo.product.model.ProductInfo;
import com.demo.product.service.ProductService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RequestMapping("/product")
@RestController
public class ProductController{@Autowiredprivate ProductService productService;@RequestMapping("/{productId}")public ProductInfo getProductById(@PathVariable Integer productId) {log.info("接收参数,productId:" + productId);return productService.selectProductById(productId);}}

服务部署

maven 打包默认是从远程仓库下载的,但是由于我们之前把 jar 包放到了本地的 maven 仓库,所以程序会启动失败。解决方案如下:

  1. 上传到 maven 仓库,如何发布Jar包到Maven中央仓库 - 简书。
  2. 搭建 maven 私服,上传 jar 包到私服。
  3. 从本地读取 jar 包。

在这里选择第三种方法。

  1. 把 jar 包放到本地的 maven 仓库

image-20250318162508525

  1. 更改消费者服务的配置文件

           <dependency><groupId>org.example</groupId><artifactId>product-api</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency>
    

    compile 改为system,并添加 systemPath

            <dependency><groupId>org.example</groupId><artifactId>product-api</artifactId><version>1.0-SNAPSHOT</version><scope>system</scope><systemPath>C:/Users/awa/.m2/repository/org/example/product-api/1.0-SNAPSHOT/product-api-1.0-SNAPSHOT.jar</systemPath></dependency>
    

    systemPath的位置在:

    image-20250318162958681

    更改 spring-boot-maven-plugin 添加configuration并将includeSystemScope设置为 true

            <plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><includeSystemScope>true</includeSystemScope></configuration></plugin></plugins>
    

    刷新 maven

剩下的参考 博客系统笔记总结 2( Linux 相关) 中的部署 Web 项目到 Linux。


本文到这里就结束啦~

在这里插入图片描述

http://www.dtcms.com/wzjs/329685.html

相关文章:

  • asp网站跳转浏览器ttkefu在线客服系统官网
  • 疫情防控措施再优化福建seo排名
  • 长沙本土网站制作公司班级优化大师免费下载学生版
  • 阜阳 做网站网络营销外包网络推广
  • 利用网站制作网页网页查询
  • 杭州网站建设nuoweb大学生网页制作成品模板
  • 专门做日本旅游的网站公司seo是指什么意思
  • 哈尔滨网站开发公司百度 竞价排名
  • 万网是做网站的吗seo相关岗位
  • 网站建设有关数据库的代码行业关键词一览表
  • 谷歌英文网站推广网络seo外包
  • 江苏南京疫情最新消息小程序seo
  • 建立网站需要什么设备上海seo公司排名榜
  • 廊坊网站制作网站常州网站seo
  • 企业展厅建设公司怎么优化一个网站
  • 网站的首页文案如何优化网络连接
  • 华为应用商店下载沧州seo公司
  • 基础集团网站建设网站设计制作的服务怎么样
  • 禹城网站建设电话网络营销的现状及问题
  • 濮阳建设银行官方网站百度提交入口网址是什么
  • 宿迁网站建设哪家专业线下推广团队
  • 许昌做网站汉狮网络微信公众号运营推广方案
  • 网站建设常用的方法班级优化大师的优点
  • 网络服务费要交印花税吗seo关键词排名优化案例
  • 怎么做有个捐款的网站网络seo是什么工作
  • 用flask做的网站有哪些郑州网站seo公司
  • 沈阳工伤保险做实网站青岛做网络推广的公司有哪些
  • 河南省政府网站建设情况软服业营收破334亿
  • 网络营销专业就业公司页面优化算法
  • 专业油烟机清洗加盟公司百度seo排名帝搜软件