7

day03-搭建微服务基础环境02 - 一刀一个小西瓜

 2 years ago
source link: https://www.cnblogs.com/liyuelian/p/17287827.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

搭建微服务基础环境02

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

3.1需求分析

image-20230404170833486

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

添加数据同理。

3.2思路分析

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

3.3实现步骤

3.3.1创建Module&完成配置

步骤同上一篇的2.3.1

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

image-20230404171741276

(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: 80spring: 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 */@SpringBootApplicationpublic class MemberConsumerApplication { public static void main(String[] args) { SpringApplication.run(MemberConsumerApplication.class,args); }}

测试,启动成功:

image-20230404172942980

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 */@Configurationpublic 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@Slf4jpublic 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以表单形式发出数据:

image-20230404181807157

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

image-20230404181959840

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

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

image-20230404182548246

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

image-20230404182831554

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

image-20230404184304232

测试通过。

3.4注意事项和使用细节

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

image-20230404190948200

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

4.1需求分析

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

4.2思路分析

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

4.3实现步骤

4.3.1创建Module&完成配置

(1)创建Module--e_commerce_center_common-api

image-20230404191844697

(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/类

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

image-20230404201250380

4.3.3使用Maven打包成jar

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

image-20230404193953977
image-20230404201404982

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

image-20230404200630680

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

#Generated by Maven#Tue Apr 04 19:38:29 CST 2023version=1.0-SNAPSHOTgroupId=com.li.springcloudartifactId=e_commerce_center_common-api

4.3.4工程重构

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

image-20230404200344858

(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 两个子模块,在浏览器中发送请求进行测试:

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

image-20230404202351041

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


Recommend

  • 9
    • www.cnblogs.com 2 years ago
    • Cache

    day30-注解 - 一刀一个小西瓜

    Java注解 1.注解的理解 注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息 和注释一样,注解不影响程序逻辑,但注解可以被编译或者运...

  • 5

    线程基础01 1.程序 进程 线程 程序(program):是为完成的特定任务,用某种语言编写的一组指令的集合。简单来说,就是我们写的代码。

  • 6
    • www.cnblogs.com 2 years ago
    • Cache

    day35-IO流02 - 一刀一个小西瓜

    JavaOI流02 4.常用的类 4.1文件字节流输入流-FileInputStream InputStream抽象类是所有类字节输入流的超类 InputStream常用的...

  • 8
    • www.cnblogs.com 2 years ago
    • Cache

    day36-IO流03 - 一刀一个小西瓜

    JavaIO流03 4.常用的类02 4.4节点流和处理流

  • 8
    • www.cnblogs.com 2 years ago
    • Cache

    day38-IO流05 - 一刀一个小西瓜

    JavaIO流05 4.常用的类04 4.4节点流和处理流03 4.4.8打印流-PrintStream和PrintWriter 打印流只有输出流,没有输...

  • 6

    多用户即时通讯系统05 4.编码实现04(拓展) 拓展功能: 实现离线留言,如果某个用户不在线 ,当登陆后,可以接收离线的消息 实现离线发文件,如果某个功能没有在线,当登...

  • 6

    MySQL基础知识02 4.CRUD 数据库CRUD语句:增(create)、删(delete)、改(update)、查(Retrieve) Insert 语句 (添加数据) Update 语句(更新数据) Delete 语句(删除数据)...

  • 8

    JDBC和连接池05 11.BasicDAO 先来分析一个问题 前面我们使用了Apache-DBUtils和Druid简化了JDBC开发,但仍存在以下不足: SQL语句是固定的,不能通过参数传入,通用性不好...

  • 5

    正则表达式01 5.1正则表达式的作用 正则表达式的便利 在一篇文章中,想要提取相应的字符,比如提取文章中的所有英文单词,提取文章中的所有数字等。 ...

  • 4

    Hexo博客搭建记录 参考视频:手把手教你从0开始搭建自己的个人博客 |无坑版视频教程 ...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK