SpringCloud 学习(一)简介和环境搭建

news2024/11/16 22:11:41

1. 简介

1.1 SpringCloud

SpringCloud 基于 SpringBoot 提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了 NetFlix 的开源组件做高度抽象封装之外,还有一些选型中立的开源组件。

SpringCloud 为开发人员提供了配置管理,服务发现,断路器,路由,微代理,事件总线,全局锁,决策竞争,分布式会话等快速构建分布式系统的工具。

SpringCloud 将各个成熟的服务框架组合起来,通过 SpringBoot 风格进行再封装,屏蔽了复杂的配置和实现原理,为开发者提供一个易部署易维护的分布式系统开发工具包。

1.2 SpringBoot 与 SpringCloud 的关系

  • SpringBoot 专注于开发单个微服务。
  • SpringCloud 是关注全局的微服务协调整理治理框架。

1.3 Dubbo 和 SpringCloud 技术选型

  • 一个成熟、传统的互联网架构

    在这里插入图片描述

  • Dubbo 和 SpringCloud 对比

    DubboSpringCloud
    服务注册中心ZookeeperSpringCloud NetFilx Eureka
    服务调度方式RPCREST API
    服务监控Dubbo-MonitorSpringBoot Admin
    断路器不完善SpringCloud NetFilx Hystrix
    服务网关SpringCloud NetFilx Zuul
    分布式配置SpringCloud Config
    服务跟踪SpringCloud Sleuth
    消息总线SpringCloud Bus
    数据流SpringCloud Stream
    批量处理SpringCloud Task

    SpringCloud 抛弃了 Dubbo 的 RPC 通信,采用 HTTP 的 REST 方式。

    SpringCloud 能够与 Spring 项目完美融合。

1.4 下载地址

  • SpringCloud 官网:Spring Cloud

  • Spring Cloud NetFlix 中文文档:Spring Cloud Netflix 中文文档 参考手册 中文版

  • Spring Cloud 中文文档:Spring Cloud Dalston 中文文档 参考手册 中文版

  • Spring Cloud 中文网:Spring Cloud中文网-官方文档中文版

1.5 版本控制

版本说明

SpringBootSpringCloud关系
1.2.xAngel(天使)兼容 Spring Boot 1.2.x
1.3.xBrixton(布里克斯顿)兼容 Spring Boot 1.3.x,Spring Boot 1.4.x
1.4.xCamden(卡姆登)兼容 Spring Boot 1.4.x,Spring Boot 1.5.x
1.5.xDalston(多尔斯顿)兼容 Spring Boot 1.5.x,不兼容 Spring Boot 2.0.x
1.5.xEdgware(埃奇韦尔)兼容 Spring Boot 1.5.x,不兼容 Spring Boot 2.0.x
2.0.xFinchley(芬奇利)兼容 Spring Boot 2.0.x,不兼容 Spring Boot 1.5.x
2.1.xGreenwich(格林威治)

版本关系

spring-boot-starter-parentspring-cloud-dependencies
版本号发布日期版本号发布日期
1.5.2.RELEASE2017年3月Dalston.RC12017年未知月
1.5.9.RELEASENov.2017Edgware.RELEASENov.2017
1.5.16.RELEASESep.2018Edgware.SR5Oct.2018
1.5.20.RELEASEApr.2019Edgware.SR5Oct.2018
2.0.2.RELEASEMay.2018Finchley.BUILD-SNAPSHOT2018年未知月
2.0.6.RELEASEOct.2018Finchley.SR2Oct.2018
2.1.4.RELEASEApr.2019Greenwich.SR1Mar.2019

2. 环境搭建

(1) 创建一个基础的 maven 项目

  • 删除 src 目录,将此项目作为父项目 springcloud

  • 管理依赖

    <!--打包方式-->
    <packaging>pom</packaging>
    
    <!--版本控制-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <lombok.version>1.16.10</lombok.version>
        <log4j.version>1.2.17</log4j.version>
    </properties>
    
    <!--依赖管理(不显示在 Libraries 中)-->
    <dependencyManagement>
        <dependencies>
            <!--springcloud-->
            <!-- https://mvnrepository.com/artifact/org.springframework.cloud/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-->
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--数据库-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
            <!--数据源-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.10</version>
            </dependency>
            <!--springboot 启动器-->
            <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>
            <!--logback-->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.3</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

(2) 创建一个 maven 模块作为 api 服务

springcloud-api

● 导入依赖

<!--pom.xml-->
<artifactId>springcloud-api</artifactId>
<!--若是 springcloud (父项目)管理的依赖,则使用父项目的依赖,无需添加版本-->
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

● 创建数据库

在这里插入图片描述

● 编写实体类

@Data
@NoArgsConstructor
/**
 * 链式写法
 * Dept dept = new Dept();
 * dept.setDeptNo(1).setDname("why").setDb_source("cloud01");
 */
@Accessors(chain = true)
public class Dept implements Serializable {

    // 主键
    private Long deptno;

    private String dname;

    // 数据所在数据库
    private String db_source;

    public Dept(String dname) {
        this.dname = dname;
    }
}

(3) 创建一个 maven 模块作为 provider 服务

springcloud-provider-dept-8001

● 导入依赖

<!--pom.xml-->
<artifactId>springcloud-provider-dept-8001</artifactId>

<dependencies>
    <!--api moudle-->
    <dependency>
        <groupId>org.example</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>
    <!--test-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-test</artifactId>
    </dependency>
    <!--web-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--jetty-->
    <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 配置文件(回顾)

<!--resources/mybatis/mybatis-config.xml-->
<?xml version="1.0" encoding="UTF-8" ?>
<!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> 

● 编写应用配置文件

# resources/application.yml
server:
  port: 8001
# mybatis
mybatis:
  type-aliases-package: com.why.springcloud.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: org.gjt.mm.mysql.Driver
    url: jdbc:mysql://localhost:3306/cloud01?useUnicode=true&characterEncoding=utf-8
    username: root
    password: 981030

● 编写 dao 和 service

@Mapper
@Repository
public interface DeptDao {

    public boolean addDept(Dept dept);

    public Dept queryById(Long id);

    public List<Dept> queryAll();
}
public interface DeptService {

    public boolean addDept(Dept dept);

    public Dept queryById(Long id);

    public List<Dept> queryAll();

}
@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    DeptDao deptDao;

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

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

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

● 编写 controller 和 启动类

@RestController
public class DeptController {

    @Autowired
    private DeptService deptService;

    // 此方法为 Post 请求方式,浏览器直接输入 url 方式无法访问,但是 consumer 服务可以调用并访问
    @PostMapping("/dept/add")
    public boolean addDept(@RequestBody Dept dept) {
        return deptService.addDept(dept);
    }

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

    @GetMapping("/dept/list")
    public List<Dept> queryAll() {
        return deptService.queryAll();
    }
    
}
@SpringBootApplication
public class DeptProvider_8001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptProvider_8001.class, args);
    }
}

● 错误解决

java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application.yml'

Caused by: org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1

Caused by: java.nio.charset.MalformedInputException: Input length = 1

file was loaded in the wrong encoding utf-8

在这里插入图片描述

  • 删除 application.yml 文件,重新创建编写

(4) 创建一个 maven 模块作为 consumer 服务

springcloud-consumer-dept-80

● 导入依赖

<artifactId>springcloud-consumer-dept-80</artifactId>

<!--实体类 + web-->
<dependencies>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>springcloud-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
</dependencies>

● 设置服务端口

# resources/application.yml
server:
  port: 80

● 将 RestTemplate 注册到 spring 中

// config
@Configuration  // spring applicationContext.xml
public class ConfigBean {

    // 注册 bean <bean></bean>
    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

● 编写控制器和主类

@RestController
public class DeptConsumerController {

    // 提供访问远程 http 服务的方法
    @Autowired
    private RestTemplate restTemplate;

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

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

    @RequestMapping("/consumer/dept/getDept/{id}")
    public Dept getDept(@PathVariable("id") Long id) {
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/getDept/"+id, Dept.class);
    }

    @RequestMapping("/consumer/dept/list")
    public List<Dept> list() {
        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);
    }
}

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

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

相关文章

【BUG】Failed_to_execute_goal_org.springframework

uuid: 606989c0-5b73-11ee-b9af-9fe36aef5f9f title: tags: [Spring Boot, Maven, 插件, 报错, 类文件版本, 兼容, 解决方案 ] categories: [ ] date: 2023-09-25 15:15:59 “ 有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准…

阿里云服务器怎么使用?网站上线全教程参考

阿里云服务器使用教程包括云服务器购买、云服务器配置选择、云服务器开通端口号、搭建网站所需Web环境、安装网站程序、域名解析到云服务器公网IP地址&#xff0c;最后网站上线全流程&#xff0c;阿小云分享阿里云服务器详细使用教程&#xff1a; 目录 阿里云服务器使用教程 …

【ccf-csp题解】第5次csp认证-第三题-模板生成系统-字符串模拟

题目描述 思路分析 这个是一个简单的字符串模拟题&#xff0c;但蕴藏了一些细节值得挖掘&#xff0c;故写于博客之中进行记录。 第一、关于数据的读入 对于前m行&#xff0c;直接使用getline函数进行读入即可&#xff0c;注意在读取完m和n之后&#xff0c;要写一个getchar&a…

德大黄鱼开捕 年产量20万吨 京东超市多举措保障黄鱼品质

作为“中国大黄鱼之都”&#xff0c;宁德大黄鱼占全国大黄鱼总产值产量均在90%以上。有关方面预计&#xff0c;今年全年宁德大黄鱼产量达20万吨&#xff0c;年增产10%&#xff0c;直接经济产值超百亿元。 宁德大黄鱼开捕活动&#xff0c;由宁德市政府、宁德渔业协会、京东超市…

Mooctest

开发者 测试框架junit 1.字符串不能除 2.a给了c 3. 4. 5.输入是否>0 6.注释

笔试强训Day3

学了一坤时Linux&#xff0c;赶紧来俩道题目放松放松。 T1&#xff1a;在字符串中找出连续最长的数字串 链接&#xff1a;在字符串中找出连续最长的数字串__牛客网 输入一个字符串&#xff0c;返回其最长的数字子串&#xff0c;以及其长度。若有多个最长的数字子串&#xff0c…

CSAPP Attack Lab

CSAPP Attack Lab 历经一个多星期&#xff0c;之前写完第一部分就一直放着了&#xff0c;稍微补充了一下知识&#xff0c;差点让第二部分吓到&#xff0c;没想到做起来还挺简单哈 这次任务是让我们当一个远古时期的萌新黑客&#xff0c;是不是很酷呀 这次上来才发现看不懂让…

Unity之Hololens如何升级MRTK内置shader支持URP

一.前言 什么是Hololens? Hololens是由微软开发的一款混合现实头戴式设备,它将虚拟内容与现实世界相结合,为用户提供了沉浸式的AR体验。Hololens通过内置的传感器和摄像头,能够感知用户的环境,并在用户的视野中显示虚拟对象。这使得用户可以与虚拟内容进行互动,将数字信…

Linux学习第19天:Linux并发与竞争实例: 没有规矩不成方圆

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 先说点题外话&#xff0c;上周参加行业年会&#xff0c;停更了一周。接下来的周五就要开启国庆中秋双节模式&#xff0c;所以有的时候&#xff0c;尤其是工作以后…

代码随想录算法训练营day6| 哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

目录 一、哈希表理论 hash function ​编辑hash collision 常见哈希结构 1&#xff09;set 2&#xff09;map 二、&#xff08;leetcode 242&#xff09;有效的字母异位词 三、&#xff08;leetcode 349&#xff09;两个数组的交集 四、&#xff08;leetcode 202&…

移动应用中的视频直播美颜sdk集成指南

在今天的移动应用生态系统中&#xff0c;视频直播已经成为了与用户互动、分享体验和传播信息的强大工具。与此同时&#xff0c;直播美颜技术也逐渐崭露头角&#xff0c;让直播主和用户在镜头前呈现出最佳状态。本文将为您提供一份详尽的指南&#xff0c;教您如何在移动应用中集…

Day56:组件库封装-TypeScript入门

配置 安装tsc工具进行编译 npm i typescript -g 查看版本号&#xff1a;tsc -v 编译ts代码-需要使用tsc编译之后才能运行&#xff0c;TS为JS的衍生&#xff0c;浏览器不能直接识别TS语法&#xff1a;tsc xxx.ts 运行ts代码&#xff1a;node xxx.js 或者直接运行ts代码——t…

怎么将aac转换成mp3格式?

怎么将aac转换成mp3格式&#xff1f;AAC&#xff08;它的全称为Advanced Audio Coding&#xff09;是一种高级音频编码格式。它采用了数字音频压缩算法&#xff0c;旨在提供更高的音频质量和更低的比特率。AAC和Mp3一样都是一种有损压缩算法&#xff0c;通过移除人耳无法察觉的…

林木种苗生产vr虚拟实训教学降低培训等待周期

林业种植管理在保护水土流失、气候变化及经济社会发展中发挥重要的作用&#xff0c;林业教学往往需要进入林区进行实操察验&#xff0c;在安全性、时间及效率上难以把控&#xff0c;因此有更多林业畜牧院校创新性地引进VR虚拟现实技术。 在林业领域&#xff0c;实地调查是获取准…

【蓝桥杯选拔赛真题63】Scratch云朵降雨 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch云朵降雨 一、题目要求 编程实现 二、案例分析 1、角色分析

批量查询中通快递单号,高效省时

您是否曾经为了查询多个中通快递单号而感到烦恼&#xff1f;传统的查询方式需要您一个个手动输入单号&#xff0c;不仅费时还容易出错。现在&#xff0c;有一个简单的方法可以解决这个问题&#xff0c;那就是使用固乔快递查询助手软件进行批量查询。下面就让我们一起来了解具体…

DockerKubernetes ❀ Service下Port端口区分

文章目录 概述案例 概述 在Kubernetes中&#xff0c;Service&#xff08;svc&#xff09;是一种抽象机制&#xff0c;用于将一组 Pod 暴露给其他应用程序或服务。Service 可以有三种类型的端口&#xff1a; nodePort&#xff1a;这是 Service 在节点上公开的端口。可以使用此…

Quartz 体系结构

Quartz的体系结构 Quartz的重要组件 Scheduler 用于与调度程序交互的主程序接口。 Scheduler调度程序-任务执行计划表&#xff0c;只有安排进执行计划的任务Job&#xff08;通过scheduler.scheduleJob方法安排进执行计划&#xff09;&#xff0c;当它预先定义的执行时间到了的时…

25626-2018 冲击压路机 课堂随笔

声明 本文是学习GB-T 25626-2018 冲击压路机. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了冲击压路机(以下简称压路机)的术语和定义&#xff0c;分类&#xff0c;要求&#xff0c;试验方法&#xff0c;检验规则&#xff0c;标…

Vue3+Elementplus引入面包屑功能

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN博客专家&#xff0c;阿里云签约博主&#xff0c;InfoQ签约博主&#xff0c;华为云云享专家&#xff0c;51CTO明日之星 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f492; 公众号&#xff1a…