草庐IT

day03-搭建微服务基础环境02

liyuelian 2023-04-09 原文

搭建微服务基础环境02

3.创建使用会员微服务模块-service consumer

3.1需求分析

浏览器向service consumer请求某个数据,service consumer会去向service provider请求数据,然后将service provider返回的数据返回给浏览器。

添加数据同理。

3.2思路分析

  1. 创建Module(member-service-consumer-80) & 完成配置
  2. 创建controller
  3. 完成测试

3.3实现步骤

3.3.1创建Module&完成配置

步骤同上一篇的2.3.1

(1)创建Module:member-service-consumer-80

(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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>E-Commerce-Center</artifactId>
        <groupId>com.li.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>member-service-consumer-80</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <!--引入相关的依赖,版本都使用父项目声明的版本-->
    <dependencies>
        <!--web-starter-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--actuator-starter 是 springboot程序的监控系统,可以实现系统的健康监测
            可以通过http://localhost:10000/actuator看到相关的连接和信息-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>

(3)创建resources/application.yml

server:
  port: 80
spring:
  application:
    name: member-service-consumer-80

(4)创建启动类

package com.li.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author 李
 * @version 1.0
 */
@SpringBootApplication
public class MemberConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(MemberConsumerApplication.class,args);
    }
}

测试,启动成功:

3.3.1业务实现

3.3.1.1utils层

创建工具类Result.java(略,见2.3.3.1)

3.3.1.2Entity层

Member.java

package com.li.springcloud.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author 李
 * @version 1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
//因为对象在网络中以流的形式传递,这里最好实现Serializable接口
public class Member implements Serializable{
    private Long id;
    private String name;
    private String pwd;
    private String mobile;
    private String email;
    private Integer gender;
}
3.3.1.3注入RestTemplate

RestTemplate 基本介绍:RestTemplate 是 Spring 提供的用于访问Rest服务的模板类,它提供来了许多便捷访问远程 Http 服务的方法。

通过 RestTemplate,我们可以向另一个微服务模块发出 Http 请求(支持 Restful 风格),去调用该模块的 Controller 提供的 API 接口,就像浏览器发出请求调用该 API 接口一样。

RestTemplate 官网:RestTemplate (Spring Framework 5.2.2.RELEASE API)

创建配置类,注入RestTemplate对象:

package com.li.springcloud.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author 李
 * @version 1.0
 * 注入RestTemplate Bean
 */
@Configuration
public class CustomInitBean {
    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}
3.3.1.4Controller层

MemberConsumerController.java:

package com.li.springcloud.controller;

import com.li.springcloud.entity.Member;
import com.li.springcloud.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * @author 李
 * @version 1.0
 */
@RestController
@Slf4j
public class MemberConsumerController {
    @Resource
    private RestTemplate restTemplate;

    //定义一个基础的url
    public static final String MEMBER_SERVICE_PROVIDER_URL =
            "http://localhost:10000";

    //添加对象到数据库表中
    @PostMapping("/member/consumer/save")
    public Result<Member> save(Member member) {
        log.info("service-consumer member={}", member);
        /**
         * MEMBER_SERVICE_PROVIDER_URL + "/member/save":就是向对应子模块发出的完整url请求
         * member:就是通过 restTemplate 发出的 post 请求携带的数据(对象)
         * Result.class:就是返回的对象类型
         */
        return restTemplate.postForObject
                (MEMBER_SERVICE_PROVIDER_URL + "/member/save",
                        member,
                        Result.class);
    }

    //根据id调用服务接口,返回member对象信息
    @GetMapping("/member/consumer/get/{id}")
    public Result<Member> getMemberById(@PathVariable("id") Integer id) {
        return restTemplate.getForObject
                (MEMBER_SERVICE_PROVIDER_URL + "/member/get/" + id,
                        Result.class);
    }
}

3.3.1完成测试

分别启动两个子模块(service consumer、service provider)

(1)测试save方法:postman以表单形式发出数据:

结果显示添加成功,但是我们在数据库中看到的确是空值:

原因是因为使用RestTemplate,它会将数据以json格式发送。解决方法是在服务模块对应方法参数中使用@RequestBody注解,将接收的json格式数据转换成对象。

最好实体类实现Serializable,支持可序列化

重新启动模块,使用postman发送数据:数据库添加成功。

(2)浏览器测试getMemberById方法:

测试通过。

3.4注意事项和使用细节

当SpringCloud的服务有多个时,管理多个服务的启动使用右上角的run会不好管理,我们可以使用Run Dashboard:idea中如何开启Dashboard

4.创建共用模块-供其他模块使用

4.1需求分析

我们在 consumer 和 provider 模块都使用到了 Member 和 Result 类,我们可以将它们抽取到共用模块(e_commerce_center_common-api),使用Maven 打包成 jar包,其他模块需要使用直接引入依赖即可。

4.2思路分析

  1. 创建Module & 完成配置
  2. 创建Entity,把共用的实体类放到对应的包下
  3. 完成测试

4.3实现步骤

4.3.1创建Module&完成配置

(1)创建Module--e_commerce_center_common-api

(2)在本模块的pom.xml引入公共的依赖

<!--引入公共模块需要的依赖-->
    <dependencies>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <!--<optional>true</optional>:防止将该依赖传递到其他模块中
                1. true 表示两个项目之间依赖不传递
                   比如 a 模块依赖了本项目,那么本项目不会把 lombok 的jar包给 a 模块
                   意义在于继承依赖时,防止jar发生版本冲突(如,a模块可以自定义需要的Lombok版本)
                2. 不设置optional或optional=默认值false,都表示传递依赖
            -->
            <optional>true</optional>
        </dependency>
    </dependencies>

4.3.2抽取共用的API/类

创建多个子模块都要使用的公共类,注意路径要和其他模块的路径相同

4.3.3使用Maven打包成jar

(1)按如下步骤进行打包:

(2)成功后会在target目录下生成对应的jar包:

并且maven-archiver下的pom.properties中生成了项目对应的坐标:

#Generated by Maven
#Tue Apr 04 19:38:29 CST 2023
version=1.0-SNAPSHOT
groupId=com.li.springcloud
artifactId=e_commerce_center_common-api

4.3.4工程重构

(1)在 member-service-provider-10000 模块删除当前模块的 entity 包和 utils 包

(2)在 member-service-provider-10000 的 pom.xml 引入公共模块:

<dependency>
    <groupId>com.li.springcloud</groupId>
    <artifactId>e_commerce_center_common-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

然后点击刷新Maven,这样就可以引入之前打包好的jar包代码了。

(3)同理,在 member-service-consumer-80 模块中也删除 entity 和 utils 包,然后在本模块的 pom.xml 文件中也引入公共模块,然后刷新。

4.3.5完成测试

分别启动 member-service-provider-10000 和 member-service-consumer-80 两个子模块,在浏览器中发送请求进行测试:

如下,测试成功,工程进行重构之后没有问题,公共模块引入各个模块之后依然可以工作。


之后如果多个模块还有公共的类,依然可以通过这种方式来抽取共用的API/类,然后通过引入公共模块的方式来简化代码。

有关day03-搭建微服务基础环境02的更多相关文章

  1. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  2. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  3. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  4. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  5. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  6. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  7. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  8. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  9. ruby-on-rails - ruby gem如何在rails环境下工作 - 2

    我试图在rails中了解rubygems是如何变得可以自动使用的,而不是在使用required的文件中gem? 最佳答案 这是通过bundler/setup完成的:http://bundler.io/v1.3/bundler_setup.html.它在您的config/boot.rb文件中是必需的。简而言之,它首先将环境变量设置为指向您的Gemfile:ENV['BUNDLE_GEMFILE']||=File.expand_path('../../Gemfile',__FILE__)然后它通过要求bundler/setup将所有ge

  10. ruby-on-rails - 我需要一个真正的 UNIX RoR 开发环境 - 2

    从一开始,我就是一个Windows高手。我从MS-DOS开始。我安装了Windows2.1以及此后的所有Windows。现在,我家里有10台不同的Windows机器在运行,从Windows7Ultimate到各种版本的WindowsServer。我还没有完成Windows8,也不想去那里。我在服务器和各种软件方面都有UNIX经验,但它并不是我的首选环境。但是,我想我正在转换。我试图假装使用Cygwin和MSYS在Windows下运行UNIX。我的目的是搭建一个开发环境。两者都让我失望了。我花了比开发更多的时间来解决一系列技术问题。这是NotAcceptable。到目前为止,我的Ruby

随机推荐