• 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 , 加入相关依赖
    
    <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-centerartifactId>
            <groupId>com.my.springcloudgroupId>
            <version>1.0-SNAPSHOTversion>
        parent>
        <modelVersion>4.0.0modelVersion>
    
        <artifactId>member-service-consumer-80artifactId>
    
    
        
        <dependencies>
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-zipkinartifactId>
            dependency>
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
            dependency>
    
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
    
    
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-actuatorartifactId>
            dependency>
    
    
            
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
            dependency>
    
            
            <dependency>
                <groupId>com.my.springcloudgroupId>
                <artifactId>e_commerce_center-common-apiartifactId>
                <version>${project.version}version>
            dependency>
    
        dependencies>
    
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    创建resources/application.yml
    server:
      port: 80
    
    • 1
    • 2
    创建主启动类com/my/springcloud/MemberConsumerApplication.java
    @SpringBootApplication
    public class MemberConsumerApplication {
        public static void main(String[] args) {
            SpringApplication.run(MemberConsumerApplication.class,args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    业务实现
    创建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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    创建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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    注入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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    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);
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    完成测试
    首先启动微服务模块: 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    添加会员数据库中为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连支持一下,创造不易您们的支持是我的动力🤞

  • 相关阅读:
    NetCore 使用 Swashbuckle 搭建 SwaggerHub
    想知道如何将PDF合并成一个?这里有三个简单的方法分享
    免安装版的Mysql安装与配置——详细教程
    C++ Qt开发:如何使用信号与槽
    opencv 任意两点切割图像
    【go零基础】go-zero从零基础学习到实战教程 - 1项目表设计
    redis的原理和源码-慢查询日志&监视器
    解决Qt中文乱码
    【实用工具】Centos 安装ARL灯塔
    Doceker-compose——容器群集编排管理工具
  • 原文地址:https://blog.csdn.net/m0_73557631/article/details/132652551