文章目录
- 1.示意图
- 2.环境搭建
- 1.创建会员消费微服务模块
- 2.删除不必要的两个文件
- 3.检查父子模块的pom.xml文件
-
- 4.pom.xml 添加依赖(刷新)
- 5.application.yml 配置监听端口和服务名
- 6.com/sun/springcloud/MemberConsumerApplication.java 创建启动类测试
- 7.测试执行
- 1.发现80端口被占用
- 2.打开命令行输入 netstat -anb 查看是谁占用了80端口
- 3.只能更换端口,使用 netstat -aon | findstr :81 来查看81端口被没被占用
- 4.application.yml 更换端口和名字为81
- 5.再次测试运行,成功在81端口监听
- 6.浏览器请求测试
- 7.更换项目名称为81(这样直接就知道这个服务在81端口监听)
- 8.细节说明
- 1.如果报错说数据库有问题,可能就是在pom.xml中保留了mybatis的依赖
- 2.解决方案:启动类排除数据源自动配置
- 3.代码实现
- 1.com/sun/springcloud/entity/Member.java 创建entity与会员中心模块保持一致
- 2.com/sun/springcloud/util/Result.java 创建Result工具类
- 3.RestTemplate 基本介绍
- 4.com/sun/springcloud/config/CustomizationBean.java 配置类注入RestTemplate的bean对象
- 5.com/sun/springcloud/controller/MemberConsumerController.java 作为会员中心微服务 save接口的中转站
- 6.启动两个微服务进行测试
- 1.首先启动会员中心微服务
- 2.启动服务消费微服务
- 3.postman测试
- 4.数据库信息
- 7.注意事项
- 1.RestTemplate发送请求的细节
- 2.entity实体类需要实现Serializable接口实现可序列化
- 3.在这个案例中
- 8.com/sun/springcloud/controller/MemberConsumerController.java 新增方法
- 9.postman测试
- 10.注意事项和细节
- 1.开启Run Dashboard/Service
- 1.打开 .idea/workspace.xml
- 2.粘贴配置代码到这里
- 3.配置代码
- 4.重启项目
- 5.查看Services
- 6.可以在这启动项目
- 7.启动之后的效果
- 2.关于微服务的细节
-
- 4.创建一个共用模块
- 1.创建公共模块 e_commerce_center-common-api
- 2.检查父子的pom.xml
-
- 3.pom.xml 引入依赖(刷新)
- 4.抽取共用api
- 5.maven打成jar包
- 6.target目录生成jar包
- 7.package和install的区别(部署项目的时候打包使用package)
- 8.工程重构
- 1.删除两个模块的Member和Result类,此时会报错
- 2.两个模块的pom.xml都引入刚才的jar包
- 1.查找公共模块jar包的坐标
- 2.pom.xml分别引入jar包
- 3.重启两个模块进行测试
-
1.示意图
![image-20240324133630813](https://img-blog.csdnimg.cn/img_convert/e5fe663853ad2169f0b612c4d6ad6304.png)
2.环境搭建
1.创建会员消费微服务模块
![image-20240324134326276](https://img-blog.csdnimg.cn/img_convert/f0ba3eabe86aba85b207d5f6968d58ae.png)
2.删除不必要的两个文件
![image-20240324134540398](https://img-blog.csdnimg.cn/img_convert/19c9986db80eeb74b9fc23c4899898eb.png)
3.检查父子模块的pom.xml文件
1.子模块
![image-20240324134701444](https://img-blog.csdnimg.cn/img_convert/34c47b5e36d747c56b167d58045860dd.png)
2.父模块
![image-20240324134801985](https://img-blog.csdnimg.cn/img_convert/377b8a3917422949a1553e7218276776.png)
4.pom.xml 添加依赖(刷新)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</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>
</dependencies>
5.application.yml 配置监听端口和服务名
server:
port: 80
spring:
application:
name: member-service-consumer-80
6.com/sun/springcloud/MemberConsumerApplication.java 创建启动类测试
package com.sun.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MemberConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(MemberConsumerApplication.class, args);
}
}
7.测试执行
1.发现80端口被占用
![image-20240324140518987](https://img-blog.csdnimg.cn/img_convert/e503b3221a1f770a4af7338f268d3442.png)
2.打开命令行输入 netstat -anb 查看是谁占用了80端口
![image-20240324140627236](https://img-blog.csdnimg.cn/img_convert/b5f45964f30ed3442b4178815509612f.png)
3.只能更换端口,使用 netstat -aon | findstr :81 来查看81端口被没被占用
![image-20240324140844982](https://img-blog.csdnimg.cn/img_convert/fda4d58a31b7516633198b388318bd0e.png)
4.application.yml 更换端口和名字为81
server:
port: 81
spring:
application:
name: member-service-consumer-81
5.再次测试运行,成功在81端口监听
![image-20240324141100526](https://img-blog.csdnimg.cn/img_convert/8592db87e5a368e320b1f98574fd090c.png)
6.浏览器请求测试
![image-20240324141452102](https://img-blog.csdnimg.cn/img_convert/f91dc58e2c1ca338ccd5cdc4b3e33f07.png)
7.更换项目名称为81(这样直接就知道这个服务在81端口监听)
![image-20240324141248037](https://img-blog.csdnimg.cn/img_convert/8223540175e235fc36e1c7f4c215ff38.png)
8.细节说明
1.如果报错说数据库有问题,可能就是在pom.xml中保留了mybatis的依赖
![image-20240324141547734](https://img-blog.csdnimg.cn/img_convert/1febfd89b5961cb721ab116156df6d36.png)
2.解决方案:启动类排除数据源自动配置
![image-20240324141703928](https://img-blog.csdnimg.cn/img_convert/d6c7ed5af7f659797e60bf9abd91a65d.png)
3.代码实现
1.com/sun/springcloud/entity/Member.java 创建entity与会员中心模块保持一致
- 因为需要使用这个实体类来接收信息,然后调用会员中心模块
package com.sun.springcloud.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Member implements Serializable {
private Long id;
private String name;
private String pwd;
private String mobile;
private String email;
private Integer gender;
}
2.com/sun/springcloud/util/Result.java 创建Result工具类
package com.sun.springcloud.util;
public class Result<T> {
private String code;
private String msg;
private T data;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Result() {
}
public Result(T data) {
this.data = data;
}
public static Result success() {
Result result = new Result<>();
result.setCode("200");
result.setMsg("success");
return result;
}
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>(data);
result.setCode("200");
result.setMsg("success");
return result;
}
public static <T> Result<T> success(String msg, T data) {
Result<T> result = new Result<>(data);
result.setCode("200");
result.setMsg(msg);
return result;
}
public static Result error(String code, String msg) {
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
public static <T> Result<T> error(String code, String msg, T data) {
Result<T> result = new Result<>(data);
result.setCode(code);
result.setMsg(msg);
return result;
}
}
3.RestTemplate 基本介绍
![image-20240324142920033](https://img-blog.csdnimg.cn/img_convert/83497f54d1520f6603a8c5783f63d2c3.png)
4.com/sun/springcloud/config/CustomizationBean.java 配置类注入RestTemplate的bean对象
package com.sun.springcloud.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class CustomizationBean {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
5.com/sun/springcloud/controller/MemberConsumerController.java 作为会员中心微服务 save接口的中转站
package com.sun.springcloud.controller;
import com.sun.springcloud.entity.Member;
import com.sun.springcloud.util.Result;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
public class MemberConsumerController {
public static final String MEMBER_SERVICE_PROVIDER_URL = "http://localhost:10001";
@Resource
private RestTemplate restTemplate;
@PostMapping("/member/consumer/save")
public Result save(Member member) {
return restTemplate.postForObject(MEMBER_SERVICE_PROVIDER_URL + "/member/save", member, Result.class);
}
}
6.启动两个微服务进行测试
1.首先启动会员中心微服务
![image-20240324151439122](https://img-blog.csdnimg.cn/img_convert/020c847049be782381dd4d03b4ac1d07.png)
2.启动服务消费微服务
![image-20240324151459426](https://img-blog.csdnimg.cn/img_convert/0001c8f0d1d178155c0256b3b8618bca.png)
3.postman测试
![image-20240324151540004](https://img-blog.csdnimg.cn/img_convert/23aeb179d631ad67a9734317ee486333.png)
4.数据库信息
![image-20240324151621298](https://img-blog.csdnimg.cn/img_convert/4a76b6d0f740bfa2bf64cff1c34fe030.png)
7.注意事项
1.RestTemplate发送请求的细节
- 通过RestTemplate发送请求携带的参数会自动转换为json格式的数据
- 所以在接受RestTemplate的参数中必须要加@RequestBody注解
2.entity实体类需要实现Serializable接口实现可序列化
- 原因是使用RestTemplate传递参数时可能需要序列化
3.在这个案例中
- 参数并没有@RequestBody注解,所以需要通过表单传入数据
8.com/sun/springcloud/controller/MemberConsumerController.java 新增方法
@GetMapping("/member/consumer/get/{id}")
public Result getMemberById(@PathVariable("id") Long id) {
return restTemplate.getForObject(MEMBER_SERVICE_PROVIDER_URL + "/member/get/" + id, Result.class);
}
9.postman测试
![image-20240324154022333](https://img-blog.csdnimg.cn/img_convert/46891f78d0b677f50bced14c6f577440.png)
10.注意事项和细节
1.开启Run Dashboard/Service
1.打开 .idea/workspace.xml
![image-20240324155027471](https://img-blog.csdnimg.cn/img_convert/28ddb7701d8142d2fe80069b6dbc2446.png)
2.粘贴配置代码到这里
![image-20240324154605286](https://img-blog.csdnimg.cn/img_convert/f25b5f0c01f038c24b5dae741a99f586.png)
3.配置代码
<component name="RunDashboard">
<option name="configurationTypes">
<set>
<option value="SpringBootApplicationConfigurationType" />
</set>
</option>
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
4.重启项目
![image-20240324155836039](https://img-blog.csdnimg.cn/img_convert/227758da748e417f7107438608808c00.png)
5.查看Services
![image-20240324155755823](https://img-blog.csdnimg.cn/img_convert/8b4398db707cccf9d29f10fbe711b2cf.png)
6.可以在这启动项目
![image-20240324155907673](https://img-blog.csdnimg.cn/img_convert/d9d738c3ac3d70a1928c2d7fe178859f.png)
7.启动之后的效果
![image-20240324160051989](https://img-blog.csdnimg.cn/img_convert/82e98c1115907b8efcfbe6adc2c16f29.png)
2.关于微服务的细节
- 一个ip+端口就是一个微服务
- 访问微服务的方式是ip + 端口 + 上下文路径(可以是根目录)+ 资源路径
2.每个微服务接口的组成
4.创建一个共用模块
1.创建公共模块 e_commerce_center-common-api
![image-20240324161231001](https://img-blog.csdnimg.cn/img_convert/1b7bfb01c0d4694e62d2d634e13c2b46.png)
2.检查父子的pom.xml
1.子pom.xml
![image-20240324161437500](https://img-blog.csdnimg.cn/img_convert/da9fef7819e583b9d4b79208120dd859.png)
2.父pom.xml
![image-20240324161915002](https://img-blog.csdnimg.cn/img_convert/9648ca48e461e6a056193ef43df05e6d.png)
3.pom.xml 引入依赖(刷新)
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
4.抽取共用api
![image-20240324163036287](https://img-blog.csdnimg.cn/img_convert/34bdc515122599ae11caeeccba7212e7.png)
5.maven打成jar包
![image-20240324163510145](https://img-blog.csdnimg.cn/img_convert/0e3dc21811e96cd19e1c2ab2e7859ed9.png)
6.target目录生成jar包
![image-20240324163408187](https://img-blog.csdnimg.cn/img_convert/b217995a73986ed483ed963b63cd89ff.png)
7.package和install的区别(部署项目的时候打包使用package)
package
命令主要用于项目的编译和打包,但不会将产物安装到本地仓库,主要用于构建过程的测试和验证。install
命令在执行package
的基础上,进一步将打包后的文件安装到本地Maven仓库,便于其他项目的依赖引用。
8.工程重构
1.删除两个模块的Member和Result类,此时会报错
![image-20240324164248778](https://img-blog.csdnimg.cn/img_convert/978d06249b4c093290ce483979804697.png)
2.两个模块的pom.xml都引入刚才的jar包
1.查找公共模块jar包的坐标
![image-20240324164407792](https://img-blog.csdnimg.cn/img_convert/fdcff253e6960e1083088ab5ad26d607.png)
2.pom.xml分别引入jar包
<dependency>
<groupId>org.example</groupId>
<artifactId>e_commerce_center-common-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
3.重启两个模块进行测试
1.重启
![image-20240324165126302](https://img-blog.csdnimg.cn/img_convert/bc3a77d6703e077346733184292b9383.png)
2.测试
![image-20240324165146951](https://img-blog.csdnimg.cn/img_convert/123daf3788d42896c82d4841d7d36c4a.png)
![image-20240324165306040](https://img-blog.csdnimg.cn/img_convert/8ae3250fbd81928093123a8305c3584d.png)