二、微服务基础环境搭建

微服务基础环境搭建

1.创建父工程 ,用于聚合其它微服务模块

1. 需求说明/实现步骤

1.1创建父项目, 作为聚合其它微服务模块
  1. 说明:我们先创建一个父项目, 该父项目会去管理多个微服务模块(module), 如图:
    在这里插入图片描述
  2. 创建父项目步骤 – 灵活配置方式
    在这里插入图片描述


    在这里插入图片描述


    在这里插入图片描述
1.2 项目设置

在这里插入图片描述


在这里插入图片描述

1.3 删除 src, 保留一个纯净环境

在这里插入图片描述

1.4 配置父工程 pom.xml, 作为聚合其它模块

  1. 修改 D:\hspedu_springcloud_temp\e-commerce-center\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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wwk</groupId>
    <artifactId>E-Commerce-Center</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>member-service-provider-10000</module>
        <module>member-service-consumer-80</module>
        <module>e-commerce-common-api</module>
        <module>e-commerce-eureka-server-9002</module>
        <module>e-commerce-eureka-server-9001</module>
        <module>member-service-provider-10002</module>
        <module>e-commerce-consumer-openfeign-80</module>
        <module>e-commerce-gateway-20000</module>
        <module>member-service-nacos-provider-10004</module>
        <module>member-service-nacos-provider-10006</module>
        <module>member-service-nacos-consumer-80</module>
        <module>e-commerce-nacos-config-client-6000</module>
    </modules>
    <!-- 表明是一个父工程,聚合管理其他模块 -->
    <packaging>pom</packaging>
    <name>E-Commerce-Center</name>

    <!-- 统一配置各个依赖版本 -->
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>4.12</junit.version>
        <!--使用最新版本的 log4j , 防止安全漏洞 -->
        <log4j.version>2.17.2</log4j.version>
        <lombok.version>1.18.20</lombok.version>
        <mysql.version>5.1.47</mysql.version>
        <druid.version>1.1.17</druid.version>
        <mybatis.spring.boot.version>2.2.0</mybatis.spring.boot.version>
    </properties>

    <!-- 1. dependencyManagement 作用: 子模块继承后, 锁定版本, 子模块不用再写 version -->
    <dependencyManagement>
        <dependencies>
            <!--配置spring-boot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <!--
                  1. type: pom  和 scope import 配合使用
                  2. 表示 父项目的子模块, 在引入springboot相关依赖时 锁定版本为2.2.2.RELEASE
                  3. 通过 pom + import 解决maven单继承机制
                   -->
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--配置spring-cloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--配置cloud-alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--配置mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

            <!--配置druid数据源-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>

            <!--配置springboot整合mybatis starter-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.spring.boot.version}</version>
            </dependency>

            <!--配置log4j ,使用的最新高版本-->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.17.2</version>
            </dependency>

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>
  1. 修改 D:\hspedu_springcloud_temp\e-commerce-center\pom.xml, 删除不需要的配置节点,如果pom文件里有build和reporting 节点直接删除即可。

2.注意事项和细节

Maven 的 dependencyManagement 细节说明

  1. Maven 使用 dependencyManagement 元素来提供了一种管理依赖版本号的方式 。通常在项目packaging为POM,中使用 dependencvManadement 元素。
  2. 使用 pom.xml 中的 dependencyManagement 元素能让所有在子项目中引用一个依赖, Maven 会沿着父子层次向上走,直到找到一个拥有 dependencyManagement元素的项目 , 然后它就会使用这个 dependencyManagement 元素中指定的版本号。
  3. 好处∶如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项 目里都声明一个版本号,当升级或切换到另一个版本时,只需要在顶层父容器 里更新,而不需要分别在子项目的修改;另外如果某个子项目需要另外的一个版 本,只需要声明 version 就可。
  4. dependencyManagement 里只是声明依赖,并不实现引入,因此子项 目需要显示的声明需要用的依赖。
    在这里插入图片描述
  5. 如果不在子项目中声明依赖,是不会从父项目中继承下来的; 只有在子项目 中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且 version 和 scope 都读取自父 pom
  • 作用范围一览图
    在这里插入图片描述
  1. 如果子项目中指定了版本号,那么会使用子项目中指定的 jar 版本

2.创建会员中心微服务模块 -service provider

1. 需求说明/图解

1.1通过浏览器可以获取会员信息(通过会员中心微服务模块)

在这里插入图片描述

1.2 使用 Postman 测试查询

在这里插入图片描述

1.3 通过 Postman 测试添加

在这里插入图片描述

2. 思路分析/图解

  1. 创建 Moduel & 完成配置
  2. 创建数据库/表
  3. 创建 entity-dao/Mapper.xml-service-controller
  4. 完成测试

3. 实现步骤

1. 创建 Moduel & 完成配置
1.1 创建 member-service-provider-10000 微服务模块[提供会员服务]
  • 具体操作步骤
    在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

父工程的 pom.xml-会做相应变化,管理 member-service-provider-10000 微服务子模块

在这里插入图片描述

1.2 修改 member-service-provider-10000 的 pom.xml , 加入相关依赖
  1. 修改 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.wwk</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <!-- 因为是子模块,因此不需要指定 groupId 了,从父工程继承 -->
    <artifactId>member-service-provider-10000</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 如果在子工程/模块指定了 version,则以指定为准 -->
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.14</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.wwk</groupId>
            <artifactId>e-commerce-common-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- 1. starter-actuator是springboot程序的监控系统,可以实现健康检查,info 信息等
        2. 访问 http://localhost:10000/actuator 可以看到相关链接, 还可以做相关设置. -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
</project>
  1. 刷新 maven , 注意看引入的 jar 的版本.
    在这里插入图片描述
1.3 创建 resources/application.yml
server:
  port: 10000
spring:
  application:
    name: member-service-provider #名称,可以自己指定
  datasource:
    url: jdbc:mysql://localhost:3306/e_commerce_center_db?useUnicode=true&characterEncoding=utf-8&useSSL=true
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
  zipkin:
    base-url: http://localhost:9411
  sleuth:
    sampler:
      probability: 1

mybatis:
  type-aliases-package: com.wwk.springcloud.entity  # 实体类的包路径
  mapper-locations: classpath:mapper/*.xml  #后面 mapper 文件的位置
1.4 创建主启动类 MemberApplication
//注意加上@SpringBootApplication
@SpringBootApplication
public class MemberApplication10000 {
    public static void main(String[] args) {
        SpringApplication.run(MemberApplication10000.class,args);
    }
}
2. 创建数据库/表
CREATE DATABASE e_commerce_center_db;
USE e_commerce_center_db; 
CREATE TABLE member 
( 
	id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'id', 
	NAME VARCHAR(64) COMMENT '用户名', 
	pwd CHAR(32) COMMENT '密码', 
	mobile VARCHAR(20) COMMENT '手机号码', 
	email VARCHAR(64) COMMENT '邮箱', 
	gender TINYINT COMMENT '性别', PRIMARY KEY (id) 
);

INSERT INTO member VALUES (NULL, 'smith', MD5('123'), '123456789000', 'smith@sohu.com', 1); SELECT * FROM member
3. 业务实现
3.1 entity
  1. 创建 com/hspedu/springcloud/entity/Member.java
package com.wwk.springcloud.entity;

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

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member implements Serializable {
    private Long id;
    private String name;
    private String pwd;
    private String mobile;
    private String email;
    private Integer gender;
}


  1. 创建 com/hspedu/springcloud/entity/Result.java
/**
 * 1. 用于返回结果, 利于 json 格式 
 * 2. 这个工具类, 在网上也可找到
 */
package com.wwk.springcloud.entity;

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() {

   }

   //带参构造器-指定返回的data
   public Result(T data) {
       this.data = data;
   }

   //编写方法-返回需要的Result对象-表示成功的Result
   public static Result success(String code,String msg) {
       Result result = new Result<>();
       result.setCode(code);
       result.setMsg(msg);
       return result;
   }

   //编写方法-返回需要的Result对象-表示成功的Result,同时可以携带数据
   //如果需要在static方法使用泛型,需要在 static <T>
   public static <T> Result<T> success(String code,String msg,T data) {
       Result<T> result = new Result<>(data);
       result.setCode(code);
       result.setMsg(msg);
       return result;
   }

   //编写方法-返回需要的Result对象-表示失败的Result
   public static Result error(String code, String msg) {
       Result result = new Result<>();
       result.setCode(code);
       result.setMsg(msg);
       return result;
   }

   //编写方法-返回需要的Result对象-表示失败的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.2 Dao
  1. 创建接口:com/hspedu/springcloud/dao/MemberDao.java
package com.wwk.springcloud.dao;

import com.wwk.springcloud.entity.Member;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface MemberDao {
   public Member getMemberById(Long id);

   public int save(Member member);
}

  1. 创建 resources/mapper/MemberMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wwk.springcloud.dao.MemberDao">

   <resultMap id="memberMap" type="Member">
       <id column="id" property="id"/>
       <result property="name" column="name"/>
       <result property="pwd" column="pwd"/>
       <result property="mobile" column="mobile"/>
       <result property="email" column="email"/>
       <result property="gender" column="gender"/>
   </resultMap>
   <select id="getMemberById" parameterType="Long" resultMap="memberMap">
       select * from `member` where id=#{id}
   </select>
   <insert id="save" parameterType="Member">
       INSERT INTO `member` (`name`,`pwd`,`mobile`,`email`,`gender`) VALUES(#{name},MD5(#{pwd}),#{mobile},#{email},#{gender})
   </insert>
</mapper>

  • 完成测试
3.3 Service
  1. 创建接口:com/hspedu/springcloud/service/MemberService.java
package com.wwk.springcloud.service;

import com.wwk.springcloud.entity.Member;

public interface MemberService {
   public Member getMemberById(Long id);

   public int save(Member member);
}

  1. 创建 com/hspedu/springcloud/service/impl/MemberServiceImpl.java
package com.wwk.springcloud.service.impl;

import com.wwk.springcloud.dao.MemberDao;
import com.wwk.springcloud.entity.Member;
import com.wwk.springcloud.service.MemberService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class MemberServiceImpl implements MemberService {

    @Resource
    private MemberDao memberDao;

    @Override
    public Member getMemberById(Long id) {
        return memberDao.getMemberById(id);
    }

    @Override
    public int save(Member member) {
        return memberDao.save(member);
    }
}
  • 完成测试
3.4 Controller
  1. 创建:com/hspedu/springcloud/controller/MemberController.java
package com.wwk.springcloud.controller;

import com.wwk.springcloud.entity.Member;
import com.wwk.springcloud.service.MemberService;
import com.wwk.springcloud.entity.Result;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

@RestController
public class MemberController {
    @Resource
    private MemberService memberService;
    
    @GetMapping("/get/{id}")
    public Result getMemberById(@PathVariable("id")Long id){
        Member member = memberService.getMemberById(id);
        if(member!=null){
           return Result.success("200","查询到"+id+"的数据,member-service-provider-10000",member);
        }else {
            return Result.error("400","没有查询到数据");
        }
    }

    @PostMapping("/save")
    public Result save(@RequestBody Member member){
        int save = memberService.save(member);
        if(save >0){
            return Result.success("200","增加会员成功");
        }else {
            return Result.error("401","增加会员失败");
        }
    }

}

3.4 完成测试

方式一:浏览器: http://localhost:10000/member/get/1

在这里插入图片描述

方式二:PostMan

测试查询:
在这里插入图片描述

测试添加:
在这里插入图片描述

4. 注意事项和细节

  1. 我们的前端如果是以 json 格式来发送添加信息 furn,那么我们需要使用@RequestBody, 才能将数据封装到对应的 bean, 同时保证 http 的请求头的 content-type 是对应

在这里插入图片描述

  1. 如果前端是以表单形式提交了/或者是以 parameters,则不需要使用@RequestBody, 才 会进行对象参数封装, 同时保证 http 的请求头的 content-type 是对应
  2. 在进行 SpringBoot 应用程序测试时引入的 JUnit 是 org.junit.jupiter.api.Test
  3. 在运行程序时,一定要确保你的 XxxxMapper.xml 文件 被自动放到的 target 目录的 classes 指定目录

在这里插入图片描述

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

1. 需求说明/图解

  • 示意图

在这里插入图片描述

  • 浏览器: http://localhost/member/consumer/get/1
    在这里插入图片描述
  • 测试添加会员 : http://localhost/member/consumer/save

在这里插入图片描述

在这里插入图片描述

2. 思路分析/图解

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

3. 实现步骤

3.1 创建 Moduel & 完成配置

1. 创建 member-service-consumer-80 微服务模块[使用会员服务]
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

父工程的 pom.xml-会做相应变化,管理 member-service-consumer-80 微服务 子模块
在这里插入图片描述

2. 修改 member-service-consumer-80 的 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.wwk</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>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
<!--        springboot程序监控系统,监控程序系统是否健康-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
</project>

**3. 创建 resources/application.yml **
server: port: 80

4.创建主启动类 com/hspedu/springcloud/MemberConsumerApplication.java

package com.wwk.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);
    }
}

3.2 业务实现

1.entity

  1. 创建 com/hspedu/springcloud/entity/Member.java
package com.wwk.springcloud.entity;

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

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member implements Serializable {
    private Long id;
    private String name;
    private String pwd;
    private String mobile;
    private String email;
    private Integer gender;
}


  1. 创建 com/hspedu/springcloud/entity/Result.java
package com.wwk.springcloud.entity;

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() {

    }

    //带参构造器-指定返回的data
    public Result(T data) {
        this.data = data;
    }

    //编写方法-返回需要的Result对象-表示成功的Result
    public static Result success(String code,String msg) {
        Result result = new Result<>();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

    //编写方法-返回需要的Result对象-表示成功的Result,同时可以携带数据
    //如果需要在static方法使用泛型,需要在 static <T>
    public static <T> Result<T> success(String code,String msg,T data) {
        Result<T> result = new Result<>(data);
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

    //编写方法-返回需要的Result对象-表示失败的Result
    public static Result error(String code, String msg) {
        Result result = new Result<>();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

    //编写方法-返回需要的Result对象-表示失败的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;
    }
}

2. 注入 RestTemplate

  • 基本介绍
    1、RestTemplate 是 Spring 提供的用于访问 Rest 服务的模板类
    2、RestTemplate 提供了多种便捷访问远程 Http 服务的方法
    3、老韩说明:小伙伴可以这样理解, 通过 RestTemplate, 我们可以发出 http 请求(支持 Restful 风格), 去调用 Controller 提供的 API 接口, 就像我们使用浏览器发出 http 请求, 调用该 API 接口一样.
    4、使用简单便捷
  1. 创建配置类: com/hspedu/springcloud/config/CustomizationBean.java
package com.wwk.springcloud.config;

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

@Configuration
public class CustomizationBean {

    @Bean
    @LoadBalanced//配置负载均衡
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

3. Controller

  1. 创建:com/hspedu/springcloud/controller/MemberConsumerController.java
package com.wwk.springcloud.controller;

import com.wwk.springcloud.entity.Member;
import com.wwk.springcloud.entity.Result;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
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;

@RestController
public class MemberConsumerController {
    @Resource
    private RestTemplate restTemplate;

    public static final String MEMBER_SERVICE_PROVIDER_URL="http://localhost:10000";
    @PostMapping("/member/consumer/save")
    public Result save(Member member){
    /**
    * 1. MEMBER_SERVICE_PROVIDER_URL + "/member/save" 请求的 url 
    * 2. member 请求参数 
    * 3. Result.class http 响应被转换的对象类型 */
       return restTemplate.postForObject(MEMBER_SERVICE_PROVIDER_URL+"/save",member,Result.class);
    }

    @GetMapping("/member/consumer/{id}")
    public Result getMemberById(@PathVariable("id") Long id){
        return restTemplate.getForObject(MEMBER_SERVICE_PROVIDER_URL+"/get/"+id,Result.class);
    }
}

3.3 完成测试

1.首先启动微服务模块: member-service-provider-10000 和 member-service-consumer-80
2.浏览器: http://localhost/member/consumer/get/1

在这里插入图片描述

3. PostMan:
测试添加会员 : http://localhost/member/consumer/save:
在这里插入图片描述
在这里插入图片描述

3.4 注意事项和使用细节

1. 如果 member-service-consumer-80 启动报错: springBoot 启动 If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.

//加入排除 DataSourceAutoConfiguration 自动配置
 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) 
 public class MemberConsumerApplication { 
 	public static void main(String[] args) { 
 		SpringApplication.run(MemberConsumerApplication.class, args); 
 	} 
 }

2. 添加会员数据库中为 null 的解决方案

在这里插入图片描述

在这里插入图片描述

3 开启 Run DashBoard

  • 什么是 Run Dashboard
    当 springcloud 的服务有多个时,管理多个服务的启动使用 run 会不好管理,这样我们就可以使用 Run Dashboard。
    如图:
    在这里插入图片描述
    新版的 2020 的 IDEA 当你同时启动两个微服务时,不会弹出启动 Run Dashboard 窗口的提示,是因 为 IDEA2020 将 Run Dashboard 添加到控制台 Service 中

开启 Run Daahboard/Service 的步骤

  1. 找到 你的项目/.idea/workspace.xml 文件在其中添加下面的代码即可
    在这里插入图片描述
 <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>
  1. 重新启动 idea2020.2 , 会看到如下界面 , 如果没有看到这个 Services, 参考第 3 步添加一下即可

在这里插入图片描述

  1. 如果没有看到这个 Services, 添加一下即可
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  1. 启动你的微服务,就会在 Service 面板上看到各个微服务模块, 也可以进行管理
    在这里插入图片描述

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

1. 需求说明/图解

在这里插入图片描述

2. 思路分析/图解

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

3. 实现步骤

创建 e_commerce_center-common-api在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

父工程的 pom.xml-会做相应变化,管理 e_commerce_center-common-api 子模块

在这里插入图片描述
修改 e_commerce_center-common-api 的 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.wwk</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>e-commerce-common-api</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>
</project>

抽取共用 API/类

  • entity【从前面的工程拷贝即可】
package com.wwk.springcloud.entity;

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

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member implements Serializable {
    private Long id;
    private String name;
    private String pwd;
    private String mobile;
    private String email;
    private Integer gender;
}


  • 创建 com/hspedu/springcloud/entity/Result.java
package com.wwk.springcloud.entity;

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() {

    }

    //带参构造器-指定返回的data
    public Result(T data) {
        this.data = data;
    }

    //编写方法-返回需要的Result对象-表示成功的Result
    public static Result success(String code,String msg) {
        Result result = new Result<>();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

    //编写方法-返回需要的Result对象-表示成功的Result,同时可以携带数据
    //如果需要在static方法使用泛型,需要在 static <T>
    public static <T> Result<T> success(String code,String msg,T data) {
        Result<T> result = new Result<>(data);
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

    //编写方法-返回需要的Result对象-表示失败的Result
    public static Result error(String code, String msg) {
        Result result = new Result<>();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

    //编写方法-返回需要的Result对象-表示失败的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;
    }
}

使用 Maven 打包成 jar

操作步骤:

在这里插入图片描述

在这里插入图片描述

4. 工程重构

在 member-service-consumer-80 引入e_commerce_center-common-api-1.0-SNAPSHOT.jar

  1. 删除原来的 entity 包
  2. 修改 pom.xml
<!-- 引入 e_commerce_center-common-api -->
 <dependency>
 	<groupId>com.hspedu.springcloud</groupId>
 	<artifactId>e_commerce_center-common-api</artifactId> 
 	<version>${project.version}</version> 
 </dependency>

在 member-service-provider-10000 引入 e_commerce_center-common-api-1.0-SNAPSHOT.jar

  1. 删除原来的 entity 包
  2. 修改 pom.xml
<!-- 引入 e_commerce_center-common-api -->
 <dependency>
 	<groupId>com.hspedu.springcloud</groupId>
 	<artifactId>e_commerce_center-common-api</artifactId> 
 	<version>${project.version}</version> 
 </dependency>

5. 完成测试

  1. 首先启动微服务模块: member-service-provider-10000 和 member-service-consumer-80
  2. 浏览器: http://localhost/member/consumer/get/1
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值