微服务案例搭建

news2024/12/26 21:24:38

案例搭建

使⽤微服务架构的分布式系统,微服务之间通过⽹络通信。我们通过服务提供者与服务消费者来描述微服 务间的调⽤关系。

        服务提供者:服务的被调⽤⽅,提供调⽤接⼝的⼀⽅

        服务消费者:服务的调⽤⽅,依赖于其他服务的⼀⽅

我们以电商系统中常⻅的⽤户下单为例,⽤户向订单微服务发起⼀个购买的请求。在进⾏保存订单之前 需要调⽤商品微服务查询当前商品库存,单价等信息。在这种场景下,订单微服务就是⼀个服务消费 者,商品微服务就是⼀个服务提供者。

3.1 数据库表

shop_order订单表 shop_product商品表 shop_user⽤户表

3.2 服务模块

1. 创建模块

创建公共⽗模块springcloud_alibaba

创建公共模块 shop_common ,⽤于存放公共的实体类和⼯具类

创建订单微服务模块 shop_order 端⼝809X

创建商品微服务模块 shop_product 端⼝808X

创建⽤户微服务模块 shop_user 端⼝807X

 

2. 在父模块的pom.xml中配置

<?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>
    
    <!--父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.13</version>
    </parent>

    <!--父项目的子模块-->
    <modules>
        <module>spring_common</module>
        <module>shop_order</module>
        <module>shop_user</module>
        <module>shop_product</module>
    </modules>

    <groupId>com.apesource</groupId>
    <artifactId>springcloud_alibaba</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!--pom:父文件-->
    <packaging>pom</packaging>
    <name>springcloud_alibaba</name>
    <description>springcloud_alibaba</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-cloud.version>Greenwich.RELEASE</spring-cloud.version>
        <spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version>
    </properties>


    <!--
    dependencyManagement所包含的坐标,子项目不会直接继承,需要声明才可继承
    -->
    <dependencyManagement>
        <dependencies>
            <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. 在product、order、user子模块中导入公共子模块common的坐标

        <!--shop-common-->
        <dependency>
            <groupId>com.apesource</groupId>
            <artifactId>spring_common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

3.3 服务调⽤

前⽂已经编写了三个基础的微服务,在⽤户下单时需要调⽤商品微服务获取商品数据。那应该怎么做 呢?总⼈皆知商品微服务提供了供⼈调⽤的HTTP接⼝。所以可以再下定单的时候使⽤http请求的相关⼯ 具类完成,如常⻅的HttpClient ,OkHttp,当然也可以使⽤Spring提供的RestTemplate

3.3.1 RestTemplate介绍

Spring框架提供的RestTemplate类可⽤于在应⽤中调⽤rest服务,它简化了与http服务的通信⽅式,统 ⼀了RESTful的标准,封装了http链接, 我们只需要传⼊url及返回值类型即可。相较于之前常⽤的 HttpClient ,RestTemplate是⼀种更优雅的调⽤RESTful服务的⽅式。

在Spring应⽤程序中访问第三⽅REST服务与使⽤Spring RestTemplate类有关。 RestTemplate类的设 计 原则与许多其他Spring 模板类(例如JdbcTemplate、JmsTemplate)相同,为执⾏复杂任务提供了⼀ 种具有默认⾏为的简化⽅法。 RestTemplate默认依赖JDK提供http连接的能⼒(HttpURLConnection),如果有需要的话也可以通过 setRequestFactory⽅法替换为例如 Apache HttpComponents、 Netty或OkHttp等其它HTTP library。 考虑到RestTemplate类是为调⽤REST服务⽽设计的,因此它的主要⽅法与REST的基础紧密相连就不⾜ 为奇了,后者是HTTP协议的⽅法:HEAD、GET、 POST、 PUT、 DELETE和OPTIONS。例如, RestTemplate类具有headForHeaders()、getForObject()、 postForObject()、 put()和delete()等⽅ 法。

3.3.2 RestTemplate⽅法介绍

分为三组:

  • getForObject --- optionsForAllow 分为一组,这类方法是常规的 Rest API(GET、POST、DELETE 等)方法调用;
  • exchange:接收一个 RequestEntity 参数,可以自己设置 HTTP method,URL,headers 和 body,返回 ResponseEntity;
  • execute:通过 callback 接口,可以对请求和返回做更加全面的自定义控制。

3.3.3 通过RestTemplate调⽤微服务

( 1 )在 shop_order⼯程中配置RestTemplate

@SpringBootApplication
public class ShopOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShopOrderApplication.class, args);
    }
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

( 2 )编写下订单⽅法 //通过restTemplate调⽤商品微服务 restTemplate .getForObject("http://127.0.0.1:8081/product/1" , Product.class);

//商品Controller类
@RestController
public class ProductController {

    @Autowired
    IProductService productService;

    @RequestMapping("/product/{pid}")
    public Product product(@PathVariable("pid") Integer pid){
        Product product = productService.getById(pid);
        return product;
    }
}

//订单Controller类
@RestController
public class OrderController {
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private IOrderService orderService;

    @RequestMapping("/order/prod/{pid}")
    public Order order(@PathVariable("pid") Integer pid){
        //调用商品微服务,查询商品信息
        Product product = restTemplate.getForObject("http://localhost:8081/product/"+pid,Product.class);
        //下单(常见订单)
        Order order = new Order();
        order.setUid(1);
        order.setUsername("测试用户1");
        order.setPid(pid);
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());
        order.setNumber(1);
        orderService.createOrder(order);
        return order;
    }
}

3.3.4 硬编码存在的问题

⾄此已经可以通过RestTemplate调⽤商品微服务的ResTFul API接⼝。但是我们把提供者的⽹络地址 (ip,端⼝)等硬编码到了代码中,这种做法存在许多问题:

  • 应⽤场景有局限
  • ⽆法动态调整 

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

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

相关文章

pyenv-win | python版本管理,无需卸载当前版本

系统&#xff1a;windows&#xff0c;且已安装git。 使用 pyenv-win 在Windows中管理多个python版本&#xff0c;而无需卸载当前版本。安装步骤如下&#xff1a; 安装 pyenv-win 1. 安装 Git 和 pyenv-win: git clone https://github.com/pyenv-win/pyenv-win.git %USERPRO…

河南萌新联赛2024第(二)场:南阳理工学院

河南萌新联赛2024第&#xff08;二&#xff09;场&#xff1a;南阳理工学院 2024.7.24 13:00————15:00 过题数5/11 补题数6/11 国际旅行Ⅰ 国际旅行Ⅰ 小w和大W的决斗。 A*BBBB “好”字符 水灵灵的小学弟 lxy的通风报信 狼狼的备忘录 重生之zbk要拿回属于他的一切 这是签…

THS配置keepalive(yjm)

启动完THS管理控制台和THS后&#xff0c;登录控制台&#xff0c;进入实例管理》节点管理&#xff0c;可以分别使用界面配置和编辑配置设置长连接。 1、界面配置 点击界面配置》集群设置&#xff0c;启用长连接&#xff0c;设置长连接数、最大请求数和超时时间。 2、编辑配置 …

文章自然润色 API 数据接口

文章自然润色 API 数据接口 ai / 文本处理 基于 AI 的文章润色 专有模型 / 智能纠错。 1. 产品功能 基于自有专业模型进行 AI 智能润色对原始内容进行智能纠错高效的文本润色性能全接口支持 HTTPS&#xff08;TLS v1.0 / v1.1 / v1.2 / v1.3&#xff09;&#xff1b;全面兼容…

12.Spring事务和事务传播机制

文章目录 1.为什么需要事务2.Spring 中事务的实现2.1 MySQL 中的事务使⽤2.2 Spring 编程式事务2.3 Spring 声明式事务&#xff08;自动&#xff09;2.3.1 Transactional 作⽤范围2.3.2 Transactional 参数说明2.3.3 注意事项2.3.4 Transactional ⼯作原理 3.事务隔离级别3.1 事…

Python 爬虫 instagram api获取用户主页tagged media标记内容

此instagramAPI接口可获取指定用户主页tagged media标记内容 详细采集页面参考下图及链接&#xff0c;如有需要&#xff0c;可通过文末链接联系我们。 https://www.instagram.com/javan/tagged/ 请求API http://api.xxxx.com/ins/user/tagged?user_id18527&count12&…

网络原理_初识

目录 一、局域网LAN 二、广域网WAN 三、网络通信基础 3.1 IP地址 3.2 端口号 3.3 协议 3.4 五元组 3.5 OSI七层模型 3.6 TCP/IP五层模型 3.7 网络设备所在分层 3.8 封装和分用 总结 一、局域网LAN 局域网&#xff0c;即 Local Area Network&#xff0c;Local 即标…

基于opencv[python]的人脸检测

1 图片爬虫 这里的代码转载自&#xff1a;http://t.csdnimg.cn/T4R4F # 获取图片数据 import os.path import fake_useragent import requests from lxml import etree# UA伪装 head {"User-Agent": fake_useragent.UserAgent().random}pic_name 0 def request_pic…

FL Studio 21.2.3.4004中文直装版及FL Studio 204如何激活详细教程

在数字化音乐制作的浪潮中&#xff0c;FL Studio 24.1.1.4234的发布无疑又掀起了一股新的热潮。这款由Image-Line公司开发的数字音频工作站&#xff08;DAW&#xff09;软件&#xff0c;以其强大的功能和易用的界面&#xff0c;赢得了全球无数音乐制作人的青睐。本文将深入探讨…

ELK日志收集之多文件提取文件名和日志时间

需求&#xff1a;多个设备的日志同时保存在一台服务器上&#xff0c;日志文件的文件名是设备的ID&#xff0c;需要将多个文件提取文件名作为最终的筛选字段&#xff0c;同时提取日志中的时候日期时间替换系统的timestamp filebeat配置&#xff1a; filebeat.inputs:- type:…

机器学习的运作原理和算法分类,让机器学习更加通俗易懂

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

Top-down Microarchitecture Analysis Method

1、英文链接&#xff1a; 1. https://www.intel.com/content/www/us/en/docs/vtune-profiler/cookbook/2023-0/top-down-microarchitecture-analysis-method.html 2. http://portal.nacad.ufrj.br/online/intel/vtune2017/help/GUID-02271361-CCD4-410C-8338-4B8158157EB6.ht…

低代码如何加速数字化转型

数字化转型&#xff0c;正日益决定企业成功的关键。这里的一个关键因素是它可以以更快的速度和质量来实施技术计划。在当今瞬息万变的商业环境中&#xff0c;战略性地采用低代码平台对于旨在加快上市时间、增强业务敏捷性和促进跨团队无缝协作的首席技术官来说至关重要。日益增…

Python | Leetcode Python题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; class Solution { public:// 判断是否为完全平方数bool isPerfectSquare(int x) {int y sqrt(x);return y * y x;}// 判断是否能表示为 4^k*(8m7)bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7;}int numSquares(i…

Jmeter混合压测(2407)

一 压测需求&#xff1a; 电商作为服务端&#xff0c;至少需要满足并发量,QPS:100/s,TPS:20/s。例如场景&#xff1a; 电商交易中&#xff0c;商品图片请求量最多&#xff0c;电商服务端需要满足并发请求查询图片信息。各家可能会并发请求同一家电商商品、订单等内容。 二 压…

【React】条件渲染:深入探讨高效开发技巧与最佳实践

文章目录 一、什么是条件渲染&#xff1f;二、条件渲染的实现方式三、条件渲染的最佳实践四、复杂条件渲染的实现 在现代前端开发中&#xff0c;React 已成为开发者构建用户界面的首选框架之一。React 的强大之处在于其组件化和状态管理能力&#xff0c;而条件渲染则是 React 开…

WebGIS的地图渲染|SVG|Canvas|Canvas

说到地图&#xff0c;平时我们使用过百度地图、高德地图、腾讯地图等&#xff0c;如果涉及地图开发需求&#xff0c;也有很多选择&#xff0c;如前面提到的几个地图都会提供一套JS API&#xff0c;此外也有一些开源地图框架可以使用&#xff0c;如OpenLayers、Leaflet、Mapbox、…

Drools 决策表的使用与说明(一)

Drools 决策表的使用与说明 Drools决策表的使用官方文档决策表说明决策表使用方式执行drl代码及结果 Drools决策表的使用 官方文档决策表说明 Drools 决策表的使用 16.7. Spreadsheet decision tables 决策表使用方式 在Drools中&#xff0c;决策表通常是以Excel&#xff08…

ctfshow-web入门-php特性(web132-web136)

目录 1、web132 2、web133 3、web134 4、web135 5、web136 1、web132 存在 robots.txt 访问 /admin 需要传三个参数&#xff0c;并且需要满足&#xff1a; if($code mt_rand(1,0x36D) && $password $flag || $username "admin"){if($code admin){ech…

java发送https请求支持tls1.3

说明&#xff1a;java 8_u201及以下版本不支持tls1.3协议发送。最直接的方法是升级到该版本之上。 另外&#xff1a;需要修改一下代码强行使用tls1.3协议。如果只修改代码&#xff0c;不升级java版本会报错找不到该协议。