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

news2024/10/5 20:24:38

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 服务注册与发现

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

贪心算法06(leetcode738,968)

参考资料&#xff1a; https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html 738. 单调递增的数字 题目描述&#xff1a; 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。…

Python 学习flask创建项目

1、使用pycharm创建flask项目 2、运行访问地址 3、可以看到访问地址内容 4、可以增加路由&#xff0c;尝试访问获取参数

‘AndroidStudio工具平台’尝试运行‘Android原生项目’

AndroidStudio工具平台 (内嵌Intelli IDEA集成环境) /Users/haijunyan/Library/Android/sdk 配置环境变量: #adb命令,安装APK查看连接设备 platform-tools #emulator命令,通过命令创建模拟器 tools #用NDK框架搭建的项目,用到下面的命令编译 ndk-bundle 等等 //查看当前设备…

Java--递归

1.递归就是A方法调用A方法&#xff0c;也就是调用自己本身 2.利用递归可以用简单的程序来解决一些复杂的问题&#xff0c;它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&#xff0c;递归策略只需少量的程序就可描述出解题过程所需要的多次重复…

Java里面的10个Lambda表达式必须掌握,提高生产力

目录 Java里面的10个Lambda表达式必须掌握&#xff0c;提高生产力 前言 1. 使用Lambda表达式进行集合遍历 2. 使用Lambda表达式进行集合过滤 3. 使用Lambda表达式进行集合映射 4. 使用Lambda表达式进行集合排序 5. 使用Lambda表达式进行集合归约 6. 使用Lambda表达式进…

数据结构与算法题目集(中文)6-2顺序表操作集

题目地址 https://pintia.cn/problem-sets/15/exam/problems/type/6?problemSetProblemId725&page0 注意审题&#xff0c;返回false的时候不要返回ERROR&#xff0c;否则答案错误&#xff0c;机器规则是死的。 位置一般指数组下标&#xff0c;位序一般指数组下标1。但是思…

【传知代码】上下位关系自动检测方法(论文复现)

前言&#xff1a;在信息爆炸的时代&#xff0c;我们每天都沉浸在海量的数据和信息中。随着互联网技术的飞速发展&#xff0c;如何从这些信息中准确、高效地提取出有用的知识&#xff0c;成为了当下研究的热点。其中&#xff0c;上下位关系&#xff08;也称为层级关系或种属关系…

orbslam2代码解读(2):tracking跟踪线程

书接上回&#xff0c;mpTracker->GrabImageMonocular(im,timestamp)函数处理过程&#xff1a; 如果图像是彩色图&#xff0c;就转成灰度图如果当前帧是初始化的帧&#xff0c;那么在构建Frame的时候&#xff0c;提取orb特征点数量为正常的两倍&#xff08;目的就是能够在初…

使用 C# 学习面向对象编程:第 2 部分

C# 类属性简介 属性在面向对象编程中起着至关重要的作用。它们允许我们从类外部访问类的私有变量。在类中使用私有变量是很好的。属性看起来像变量和方法的组合。属性有部分&#xff1a;“get 和 set”方法。get 方法应该返回变量&#xff0c;而 set 方法应该为其赋值。 步骤…

用48个字,总结8条创业心法,悟透将受用一生!

我用48个字&#xff0c;总结8条创业心法&#xff0c;悟透将受用一生。我把这8条创业心法&#xff0c;送给副业微商圈公众号里面的所有朋友们。 希望大家能从中有所启发&#xff0c;脚踏实地&#xff0c;在学习中成长&#xff0c;在前行中坚定。人的烦恼不是源于没有钱&#xf…

【iOS】界面推出的方法

【iOS】界面推出的方法 在学习过程中我们发现在iOS中有两种界面推出的方法&#xff1a;push 和 present这两种方法都可以用来推出一个新的界面 但是这两者是存在区别的 push 方法是通过 UINavigationController 进行导航,新的视图控制器会被压入导航栈中&#xff0c;可以跨级…

BoardLight - hackthebox

简介 靶机名称&#xff1a;BoardLight 难度&#xff1a;简单 靶场地址&#xff1a;https://app.hackthebox.com/machines/603 本地环境 靶机IP &#xff1a;10.10.11.11 ubuntu渗透机IP(ubuntu 22.04)&#xff1a;10.10.16.17 windows渗透机IP&#xff08;windows11&…

springCloudAlibaba之服务熔断组件---sentinel

sentinel组件学习 sentinel学习sentinel容错机制使用代码方式进行QPS流控-流控规则初体验使用SentinelResource注解进行流控 通过代码方式设置降级规则-降级规则初体验sentinel控制台部署客户端整合服务端 springcloud整合sentinelQPS流控规则并发线程数-流控规则BlockExceptio…

wooyun_2015_110216-Elasticsearch-vulfocus

1.原理 ElasticSearch具有备份数据的功能&#xff0c;用户可以传入一个路径&#xff0c;让其将数据备份到该路径下&#xff0c;且文件名和后缀都可控。 所以&#xff0c;如果同文件系统下还跑着其他服务&#xff0c;如Tomcat、PHP等&#xff0c;我们可以利用ElasticSearch的备…

群体优化算法----火山爆发算法介绍以及离散优化Pareto最优解示例

介绍 火山爆发算法&#xff08;Volcano Eruption Algorithm&#xff0c;VEA&#xff09;是一种新兴的群智能优化算法&#xff0c;其灵感来源于火山爆发的自然现象。火山爆发算法模拟了火山爆发过程中熔岩流动和喷发的行为&#xff0c;以寻找全局最优解。这种算法利用了火山爆发…

全网短剧资源

热门短剧资源库&#xff0c;已更新了 9000&#xff0c;记得收藏&#xff1a;https://www.kdocs.cn/l/ciptAICGdWYz

ABB机械人模型下载

可以下载不同格式的 https://new.abb.com/products/robotics/zh/robots/articulated-robots/irb-6700 step的打开各部件是分开的&#xff0c;没有装配在一起&#xff0c;打开看单个零件时&#xff0c;我们会发现其各零件是有装配的定位关系的。 新建一个装配环境&#xff0c;点…

武忠祥17堂课没必要全听,这几个才是精华!

作者&#xff1a;Captain 链接&#xff1a;https://www.zhihu.com/question/381665751/answer/3197724055 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 17堂课类似于习题课&#xff0c;是专题训练 17堂课省略了…

基于AI大文本模型的智慧对话开发设计及C#源码实现,实现智能文本改写与智慧对话

文章目录 1.AI 大模型发展现状2.基于AI服务的智慧对话开发2.1 大模型API选择2.2 基于C#的聊天界面开发2.3 星火大模型API接入2.4 优化开发界面与显示逻辑 3.源码工程Demo及相关软件下载参考文献 1.AI 大模型发展现状 端午假期几天&#xff0c;关注到国内的AI大模型厂商近乎疯狂…

6.7.29 基于卷积神经网络的乳腺良恶性图像分类

计算机化乳腺癌诊断系统在早期癌症诊断中发挥着重要作用。为此&#xff0c;应用深度学习&#xff0c;利用卷积神经网络 (CNN) 对基于小型乳房 X 线图像分析协会 (mini-MIAS) 数据库的乳房 X 线图像中的异常&#xff08;良性或恶性&#xff09;进行分类。观察准确度、灵敏度和特…