Spring Cloud--从零开始搭建微服务基础环境【三】

😀前言
本篇博文是关于Spring Cloud–从零开始搭建微服务基础环境【三】,希望你能够喜欢

🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在此感谢啦😊

微服务基础环境搭建

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

需求说明/图解

示意图

image-20230825104729176

-浏览器: http://localhost/member/consumer/get/1

image-20230825104749433

测试添加会员: http://localhost/member/consumer/save

image-20230825104914674

image-20230825105008231

思路分析/图解

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

实现步骤

创建Moduel & 完成配置
创建member-service-consumer-80 微服务模块[使用会员服务]

由于创建模块步骤一致,这里不做描述。

创建模块完成后,父工程的pom.xml-会做相应变化,管理member-service-consumer-80 微服务子模块

image-20230825105513638

修改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.my.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

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


    <!--引入相关的依赖: 我们引入了当前需要的依赖,后面如果有其它需要,再灵活调整-->
    <dependencies>
        <!--引入sleuth + zipkin 依赖 说明 1. 使用的是版本仲裁 2.starter-zipkin包含了sleuth  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
        <!--引入eureka client 场景启动器starter-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--引入web-starter 说明我们使用版本仲裁(从父项目继承了版本)
        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <!--说明:starter-actuator 是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>

        <!--引入e_commerce_center-common-api-->
        <dependency>
            <groupId>com.my.springcloud</groupId>
            <artifactId>e_commerce_center-common-api</artifactId>
            <version>${project.version}</version>
        </dependency>

    </dependencies>

</project>
创建resources/application.yml
server:
  port: 80
创建主启动类com/my/springcloud/MemberConsumerApplication.java
@SpringBootApplication
public class MemberConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(MemberConsumerApplication.class,args);
    }
}
业务实现
创建entity
@AllArgsConstructor
@NoArgsConstructor
@Data
//Serializable 加上,后面可能使用
public class Member implements Serializable {
    private Long id;
    private String name;
    private String pwd;
    private String mobile;
    private String email;
    private Integer gender;
}

创建com/my/springcloud/entity/Result.java

/**
* 1. 用于返回结果, 利于json 格式
* 2. 这个工具类, 在网上也可找到
*/
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;
    }
}
注入RestTemplate
基本介绍

1、RestTemplate 是Spring 提供的用于访问Rest 服务的模板类。

2、RestTemplate 提供了多种便捷访问远程Http 服务的方法。

3、说明:小伙伴可以这样理解, 通过RestTemplate, 我们可以发出http 请求(支持Restful 风格), 去调用Controller 提供的API 接口, 就像我们使用浏览器发出http 请求,调用该API 接口一样。

4、使用简单便捷。

官网及使用

官网地址:https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html

image-20230825111004605

创建配置类: com/my/springcloud/config/CustomizationBean.java

@Configuration
public class CustomizationBean {

    //说明: 配置注入RestTemplate bean/对象
    //这里的@LoadBalanced 就是赋予 RestTemplate 负载均衡的能力
    //默认是使用轮询算法来访问远程调用接口/地址
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}
Controller

创建:com/my/springcloud/controller/MemberConsumerController.java

@RestController
@Slf4j
public class MemberConsumerController {

    //定义member_service_provider_url 这是一个基础url地址
    //使用shift+ctrl+u 进行字母大小写的切换
    /**
     * 说明:
     * 1. MEMBER-SERVICE-PROVIDER 就是服务提供方[集群], 注册到Eureka Server 的名称
     * 2. 也就是服务提供方[集群]对外暴露的名称为 MEMBER-SERVICE-PROVIDER
     * 3. MEMBER-SERVICE-PROVIDER 目前有 两个 Availability Zones member-service-provider:10000
     *    还有一个 member-service-provider:10002
     *    需要增加一个注解@LoadBalanced 赋予 RestTemplate 负载均衡的能力,也就是会根据你的负载均衡算法
     *    来选择某个服务去访问, 默认是轮询算法, 当然我们也可以自己配置负载均衡算法
     */
    public static final String MEMBER_SERVICE_PROVIDER_URL =
            "http://MEMBER-SERVICE-PROVIDER"; //后面这里地方会修改成提供服务模块的注册别名
    //装配RestTemplate bean/对象
    @Resource
    private RestTemplate restTemplate;

    //方法/接口 添加member对象到数据库/表
    //说明: 这还有一个坑, 一会就解决.
    @PostMapping("/member/consumer/save")
    public Result<Member> save(Member member) {
        log.info("service-consumer member={}", member);
        //说明
        //请的完整的url :MEMBER_SERVICE_PROVIDER_URL + "/member/save" => http://localhost:10000/member/save
        //member : 就是通过restTemplate 发出的post请求携带数据(对象)
        //Result.class: 返回对象类型
        //这里通过restTemplate 调用服务提供模块的接口, 就是一个远程调用 RPC

        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") Long id) {

        return restTemplate.getForObject(
                MEMBER_SERVICE_PROVIDER_URL + "/member/get/" + id, Result.class);
    }

}

完成测试
首先启动微服务模块: member-service-provider-10000 和member-service-consumer-80

浏览器: http://localhost/member/consumer/get/1

image-20230825111512637

注意事项和使用细节

如果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);
    }
}
添加会员数据库中为null 的解决方案

通过网络发送相当于流的形式,底层会重新变成对象以json形式传播,不做处理就会添加空。需要通过序列化发送才能反序列化恢复

image-20230825111640248

image-20230825111704396

开启Run DashBoard
什么是Run Dashboard

当springcloud 的服务有多个时,管理多个服务的启动使用run 会不好管理,这样我们就可以使用Run Dashboard。

如图

image-20230825112055848

新版的2020 的IDEA 当你同时启动两个微服务时,不会弹出启动Run Dashboard 窗口的提示,是因为IDEA2020 将Run Dashboard 添加到控制台Service 中

开启Run Daahboard/Service 的步骤
  1. 找到你的项目/.idea/workspace.xml 文件在其中添加下面的代码即可

image-20230825112134016

  1. 重新启动idea2020.2 , 会看到如下界面, 如果没有看到这个Services, 参考第3 步添加一下即可

image-20230825112204153

  1. 如果没有看到这个Services, 添加一下即可

image-20230825112221324

image-20230825112228202

image-20230825112236576

  1. 启动你的微服务,就会在Service 面板上看到各个微服务模块, 也可以进行管理

image-20230825112250634

提醒: 不同版本的IDEA 开启Run DashBoard 有区别,如果和这里IDEA 版本不同,百度下解决。

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨犀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值