初识springclould到生产者消费者的RPC通信

SpringClould

  • SpringBoot和SpringClould
  • 搭建springcloud
    • 创建项目管理
    • 实体类模块
    • 服务提供者模块
    • 消费者
  • Eureka 服务注册与发现

SpringBoot和SpringClould

springboot和springclould都是spring系列的衍生品,都可以在spring的官网找到对应的参考文档和学习路线以及核心技术

springboot

spring-cloud

springboot专注于快速的,方便的,开发单体微服务,可以离开springcloud独立使用,开发项目,开发单体个体的微服务jar

springcloud是关注于全局的服务治理框架,离不开springBoot,它将每一个springboot的单体微服务进行了整合,为各个微服务之间进行整合管理,为各个微服务之间提供配置管理,服务发现,路由,微代理,事件总线,全局锁,分布式会话等集成服务

在这里插入图片描述
这些版本都是以英国大写的字母所对应的街区名字命名的,快照版本不推荐使用,强烈推荐使用GA

搭建springcloud

创建项目管理

创建总的maven工程命名为springcloud,方便对每一个springboot进行管理,每一个springboot负责专一功能,不同的springboot项目之间的联系同依赖引入即可

引包方式是pom

<packaging>pom</packaging>

属性通过properties进行管理,统一管理相关的包的版本,方便不同插件版本的更改,比如可能存在lombok版本过低的问题,如果你在很多的springboot项目中导入了lombok,版本不同的情况,修改版本费事费力。由于本机的jdk11统一maven编译的版本和生成目标的版本是11 ,项目编码格式统一utf-8

    <properties>
        <junit.version>4.12</junit.version>
        <lombok.version>1.18.12</lombok.version>
        <log4j.version>1.2.17</log4j.version>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

创建的是包管理

    <dependencyManagement>
        <dependencies>
            <!-- spring-cloud-dependencies 相关依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
			<!-- springboot 的依赖以pom方式导入方便在子项目中进行管理 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- mysql 8 的驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.25</version>
            </dependency>
            <!-- 阿里的druid数据源 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.10</version>
            </dependency>
            <!-- mybatis-spring-boot-starter 启动依赖-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <!-- junit 单元测试 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <!-- lombok 简化实体类 -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <!-- log4j 日志 -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <!-- 日志门面 -->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.3</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

实体类模块

创建模块springcloud-api功能就只是实现一般api的编写,比如实体类Dept

lombok注解,开启链式编程

@Accessors(chain = true) 

Dept实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true) // 支持链式写法
public class Dept implements Serializable {
    private Integer id;
    private String name;
    private String source;
}

观察父项目和子项目的pom文件具有父子引用关系,父项目指定相关依赖的版本号,子项目就只需引入名称即可,不需要加版本
在这里插入图片描述
父项目的pom依赖
在这里插入图片描述

服务提供者模块

springcloud-provider-dept-8001负责提供服务,控制层,业务层,dao层,端口号设置为 8001

引入本模块的相关依赖

    <dependencies>
        <!-- 配置api的模块-->
        <dependency>
            <groupId>com.mao</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <!-- 热部署工具-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>

mybatis-config.xml开启二级缓存,或者在application.yml 的配置文件中也可以开启

<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
<!--        开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

application.yml

mybatis开启二级缓存的yml配置

mybatis:
  configuration:
    cache-enabled: true

配置服务提供者的端口号,mybatis相关配置, spring配置,注意的是二级缓存,如果自己编写了mybatis-config.xml配置文件在里面开启了二级缓存,在这里配置config-location: classpath:mybatis/mybatis-config.xml即可,要想直接在application.yml配置二级缓存,需要注释掉config-location,在加上开启缓存的配置,否则会爆出找不到sql工厂的错误

# 端口号配置
server:
  port: 8001

# mybatis配置
mybatis:
  type-aliases-package: com.mao.springclould.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

# spring配置
spring:
  application:
    name: springcloud-provider-dept
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ems?useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456

Dao层接口,@Mapper标记是Dao层的接口,或者直接在主启动类上加@MapperScan("com.mao.springclould.dao")标志这个包下面的接口全部是Dao层的接口

@Mapper
@Repository
public interface DeptDao {
    public boolean addDept(Dept dept);

    public Dept queryById(Integer id);

    public List<Dept> queryAll();
}

Dao编写对应的mapper.xml的SQL语句,在使用parameterType时候,需要配置参数别名,扫描到这个pojo的包

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mao.springclould.dao.DeptDao">
<!--    参数别名配置到springcloud-api的pojo中-->
    <insert id="addDept" parameterType="Dept">
        insert into dept (name,source) values (#(name),DATABASE());
    </insert>

    <select id="queryById" resultType="com.mao.springclould.pojo.Dept" parameterType="Integer">
        select * from dept where id = #{id};
    </select>

    <select id="queryAll" resultType="com.mao.springclould.pojo.Dept">
        select * from dept;
    </select>
    
</mapper>

Service层的接口,这层接口的方法和Dao层接口方法一模一样,只是在服务层接口的实现类上加入@Service注解,调用低层Dao层的代码

public interface DeptService {
    public boolean addDept(Dept dept);

    public Dept queryById(Integer id);

    public List<Dept> queryAll();
}

Service 业务层接口的实现类,代用Dao

@Service
public class DeptServiceImpl implements DeptService {
    @Autowired
    private DeptDao deptDao;

    @Override
    public boolean addDept(Dept dept) {
        return deptDao.addDept(dept);
    }

    @Override
    public Dept queryById(Integer id) {
        return deptDao.queryById(id);
    }

    @Override
    public List<Dept> queryAll() {
        return deptDao.queryAll();
    }
}

Controller控制器层,前台浏览器端输入的请求通过controller调用到service在调用到dao

@RestController
public class DeptController {
    @Autowired
    private DeptService deptService;

    @PostMapping("/dept/add")
    public boolean addDept(Dept dept){
        return deptService.addDept(dept);
    }

    @GetMapping("/dept/get/{id}")
    public Dept queryById(@PathVariable("id") Integer id){
        return deptService.queryById(id);
    }

    @GetMapping("/dept/list")
    public List<Dept> queryAll(){
        return deptService.queryAll();
    }
}

主启动类DeptProvider_8001

@SpringBootApplication
@MapperScan("com.mao.springclould.dao")
public class DeptProvider_8001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptProvider_8001.class,args);
    }
}

测试生产者是正常运行,可以请求到数据
在这里插入图片描述

消费者

新建springcloud-consumer-dept-80负责消费者模块,通过Rest的请求模板,不同的地址实现简单RPC通信框架
导入消费者所需要的依赖

    <dependencies>
        <dependency>
            <groupId>com.mao</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

配置文件的编写,只需要进行一个端口号的配置即可

# 端口号配置
server:
  port: 80

建立一个config的目录,负责配置文件的管理,ConfigBean集中管理各种Bean

@Configuration
public class ConfigBean {
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

controller模块中编写DeptConsumerController,通过自动注入的方式,进行装配restTemplate,通过RestFul风格的地址请求,消费者获取地址进行请求,简单的RPC框架

@RestController
public class DeptConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    private static final String REST_URL_PREFIX = "http://localhost:8001";

    @PostMapping("/consumer/dept/add")
    public boolean addDept(Dept dept){
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
    }

    @GetMapping("/consumer/dept/get/{id}")
    public Dept queryById(@PathVariable("id") Integer id){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);
    }

    @GetMapping("/consumer/dept/list")
    public List<Dept> queryAll(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);
    }
}

消费端口模块的主启动类

@SpringBootApplication
public class DeptConsumer_80 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumer_80.class,args);
    }
}

运行与查看,先启动提供者的端口,查看生产者是否可以正常运行,再运行开启消费者的端口,注意期间生产者不能关闭,否则消费者将无法访问

在这里插入图片描述

Eureka 服务注册与发现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/696150.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP“well”运动健身APP-计算机毕业设计源码87702

【摘要】 随着互联网的趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己的信息推广出去&#xff0c;最好方式就是建立自己的平台信息&#xff0c;并对其进行管理&#xff0c;随着现在智能手机的普及&#xff0c;人们对于智能手机里面的应用“well”运动健身app也在不断…

安装systemd-bootchart

要安装systemd-bootchart&#xff0c;你可以按照以下步骤进行&#xff1a; 步骤一&#xff1a;更新软件包列表 首先&#xff0c;打开终端并更新你的软件包列表&#xff0c;以确保你拥有最新的可用软件包信息。运行以下命令&#xff1a; sudo apt update步骤二&#xff1a;安…

Python 连接 MySQL 及 SQL增删改查(主要使用sqlalchemy)

目录 一、环境 二、MySQL的连接和使用 2.1方式一&#xff1a;sql为主 2.1.1创建连接 2.1.2 表结构 2.1.3 新增数据 ​编辑 2.1.4 查看数据 ​编辑 2.1.5 修改数据 2.1.6 删除数据 2.2方式二&#xff1a;orm对象关系映射 2.2.1 mysql连接 2.2.2 创建表 2.2.3 新增…

ORA-01652 表空间不够解决方案

前章&#xff1a;出现表空间不足不要手动强制删除对应数据文件存储目录下的DBF文件&#xff0c;需要用SQL语句进行数据文件的DROP&#xff0c;否则会导致ORA-01033报错&#xff0c;因为我没有开启数据库的归档所以不能通过RECOVER的形式找回数据文件最后只能重装本地ORACLE。 …

大模型如何通过token进行推理?

大型模型通过token进行推理的过程通常涉及以下步骤&#xff1a; 1、Tokenization&#xff08;分词&#xff09;&#xff1a;首先&#xff0c;输入文本或序列被分割成tokens&#xff0c;这些tokens通常是单词、子词或字符的序列。这一步通常由预训练模型的tokenizers完成。 2、…

转型AI产品经理(7):“格式塔原则”如何应用在Chatbot产品中

格式塔原则&#xff0c;又称为完形原则&#xff0c;它是一组关于人类如何感知视觉元素的心理学理论&#xff0c;这些原则说明了大脑如何将分散的视觉元素整合为有意义的整体&#xff0c;即使这些元素本身可能是分离的&#xff0c;帮助我们理解人们如何组织和解释复杂的视觉信息…

2013年 阿拉斯加巴罗活动层厚度和土壤含水量

Pre-ABoVE: Active Layer Thickness and Soil Water Content, Barrow, Alaska, 2013 ABoVE前&#xff1a;阿拉斯加巴罗活动层厚度和土壤含水量&#xff0c;2013年 简介 文件修订日期&#xff1a;2018-01-10 数据集版本&#xff1a;1 摘要 该数据集提供了 2013 年 8 月在…

速卖通如何放关联?

大家都知道&#xff0c;想要进行多账号操作必须一再小心&#xff0c;否则会有很大的关联风险&#xff0c;而账号关联所带来的后果是卖家绝对不能轻视的&#xff0c;严重的话会导致封号&#xff0c;这样一来自己前期的辛苦运营就全都打水漂了&#xff0c;因此防关联很重要&#…

在idea中创建Scala项目教程

1.下载Scala支持插件 文件-设置-插件-marketplace 搜索Scala 下载 2.创建项目 文件-新建-项目-新项目-构建系统maven 3.创建Scala目录 Scr-main(右键)-新建-目录&#xff08;Scala回车键&#xff09;-scala(右键)-将项目标记为-源代码根目录 4.对当前项目引入Scala支持 未添…

C++:day5

思维导图 例题 #include <iostream> using namespace std; class RMB { private:int yuan;int jiao;int fen;static int count;public:RMB(){count;}RMB(int yuan, int jiao, int fen) : yuan(yuan), jiao(jiao), fen(fen){count;}const RMB operator(const RMB &R)…

14.《C语言》——【牛客网BC116—BC123题目讲解】

亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&#xff0c;成为一名优…

二叉树最大宽度

文章目录 前言二叉树最大宽度1.题目解析2.算法原理3.代码编写 总结 前言 二叉树最大宽度 1.题目解析 给你一棵二叉树的根节点 root &#xff0c;返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点&#xff08;即…

这个国际档案日,大比武放榜、直播预约、课件下载,一样都不能少!

关注我们 - 数字罗塞塔计划 - 2024年6月9日第十七个国际档案日来临&#xff0c;数字罗塞塔计划放大招&#xff1a;第二届大比武活动榜单揭晓、ARCHE-2024上海智慧档案高峰论坛直播预约、2024上半年度课件大礼包下载。如此大礼&#xff0c;岂能错过&#xff1f; PART.01 榜单…

SpringCloud-面试篇(二十四)

&#xff08;1&#xff09;Nacos如何支撑数十万服务注册的压力 小型企业来讲nacos压力没有那么大&#xff0c;但是想阿里&#xff0c;服务的数量可能会达到数万&#xff0c;那麽多的服务。当服务原来越多时&#xff0c;除了服务注册以外&#xff0c;还有服务的定时更新&#x…

2_1 Linux基础操作

2_1 Linux基础操作 文章目录 2_1 Linux基础操作0. 参考1. 装机后的一些小命令查看系统的信息2. 基础命令2.1 初识基本命令2.2 日期和时间 3. 帮助命令4. 关机、重启5. 设置主机名6. rm删除7. 软件包的管理RPM、 YUM8. IP知识9. 查看一些linux的信息10. 命令行快捷键11. 光盘挂载…

网络网络层之(6)ICMPv6协议

网络网络层之(6)ICMPv6协议 Author: Once Day Date: 2024年6月2日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CS…

IPv6 自动配置流程图

IPv6 自动配置流程图 IPv6 自动配置生命周期 Mark 一下&#xff0c;理论以后再补充

Warning: `ReactDOMTestUtils.act` is deprecated in favor of `React.act`.

问题&#xff1a;在代码中使用jest进行单元测试时&#xff0c;报错如下&#xff1a; 解决思路&#xff1a; 根据报错提示出来的 react-dom/test-utils 进行全局搜索&#xff0c;发现没有该引用&#xff0c;故进入该代码块中分析。发现代码中引入testing-library/react &#…

AIGC之MetaHuman:HeyGen(基于AI驱动的视频生成平台+数字人)的简介、安装和使用方法、案例应用之详细攻略

AIGC之MetaHuman&#xff1a;HeyGen(基于AI驱动的视频生成平台数字人)的简介、安装和使用方法、案例应用之详细攻略 目录 HeyGen的简介 1、HeyGen是一款AI视频生成平台&#xff0c;它提供以下关键功能&#xff1a; HeyGen的安装和使用方法 1、使用方法 01创建或选择一个头…

强大的.NET的word模版引擎NVeloDocx

在Javer的世界里&#xff0c;存在了一些看起来还不错的模版引擎&#xff0c;比如poi-tl看起来就很不错&#xff0c;但是那是人家Javer们专属的&#xff0c;与我们.Neter关系不大。.NET的世界里Word模版引擎完全是一个空白。 很多人不得不采用使用Word XML结合其他的模版引擎来…