简介

使用Spring Boot的提升主要在于jar的打包形式给运维带来了很大的便利, 而Spring Cloud本身的优点不是那么明显, 相对于Dubbo而言, 可能体现在跨语言的交互性上(例如可以配合PHP作为前端模块), 还有现成的服务跟踪治理工具上. 对于熟悉Dubbo项目结构的开发来说, Spring Cloud的结构会相对松散, 上游的服务接口与下游的服务调用之间没有强依赖关系. 这样在上游接口调整后, 并不能及时被IDE发现而提醒下游, 会给团队配合带来一些不便.

这边通过一个例子来介绍Spring Cloud开发中的一些有益的实践.

项目结构

项目的最简化结构如下

├── scot
│   ├── pom.xml
├── scot-commons-api
│   ├── pom.xml
│   └── src
├── scot-commons-impl
│   ├── pom.xml
│   └── src
├── scot-commons-lib
│   ├── pom.xml
│   └── src
├── scot-eureka
│   ├── pom.xml
│   └── src
├── scot-web
   ├── pom.xml
   └── src

各模块的职能:

scot: 项目的根pom, 用于管理依赖Dependency 和 构建工具Plugin的版本
scot-eureka: EurekaServer 服务
scot-commons-lib: 项目的公用工具类
scot-commons-api: 服务的接口, dto和api定义, 上游服务需要实现这些api, 下游调用需要引入这个包的dto和api定义
scot-commons-impl: 服务api的接口实现.
scot-web: 对外提供访问的模块, 依赖于上游commons提供的接口

根模块 Scot: 版本控制

Scot是一个简单的pom模块, 内容如下

<?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">
<modelVersion>4.0.0</modelVersion> <groupId>com.rockbb</groupId>
<artifactId>scot</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version> <name>Scot: Root</name>
<modules>
<module>../scot-eureka</module>
<module>../scot-commons-lib</module>
<module>../scot-commons-api</module>
<module>../scot-commons-impl</module>
<module>../scot-web</module>
</modules> <prerequisites>
<maven>3.3.9</maven>
</prerequisites> <properties>
<!-- Global encoding -->
<project.jdk.version>1.8</project.jdk.version>
<project.source.encoding>UTF-8</project.source.encoding> <!-- Global dependency versions -->
<springframework.boot.version>2.0.6.RELEASE</springframework.boot.version>
<springframework.cloud.version>Finchley.RELEASE</springframework.cloud.version> <mode.development>1</mode.development>
<timestamp>${maven.build.timestamp}</timestamp>
<maven.build.timestamp.format>yyyyMMdd_HHmm</maven.build.timestamp.format>
<logback.appender>stdout</logback.appender>
</properties> <dependencyManagement>
<dependencies>
<!-- Spring Dependencies Start -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${springframework.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springframework.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${springframework.boot.version}</version>
<scope>test</scope>
</dependency>
<!-- Spring Dependencies End -->
</dependencies>
</dependencyManagement> <build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${project.jdk.version}</source>
<target>${project.jdk.version}</target>
<encoding>${project.source.encoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<encoding>${project.source.encoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${springframework.boot.version}</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

在Maven中使用 <parent> 来整体控制项目中的依赖版本是最常见的方式, 大部分中小型项目都可以使用. 因为这边不使用spring的parent而是项目自己的parent, 所以在<dependencyManagement>中增加了spring-cloud-dependencies 和 spring-boot-dependencies, 其 scope=import.

对于一些模块间互相并无层级关系, 结构较松散的项目, 可以在各模块的pom中通过添加<dependencyManagement> + scope=import 来实现同样的效果.

<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management -->
<groupId>com.rockbb</groupId>
<artifactId>version-control-pom</artifactId>
<version>1.2-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

.

Spring Cloud开发实践 - 01 - 简介和根模块的更多相关文章

  1. Spring Cloud开发实践 - 04 - Docker部署

    Docker的安装和命令可以参考 https://www.cnblogs.com/milton/p/9866963.html . 资源规划 这一步要区分传统资源和Docker资源, 为后面的细节定好基 ...

  2. Spring Cloud开发实践 - 03 - 接口实现和下游调用

    接口实现 Scot Commons Impl 接口实现模块 scot-commons-impl, 一方面实现了 scot-commons-api 的接口, 一方面将自己暴露为 REST 服务. 有4个 ...

  3. Spring Cloud开发实践 - 02 - Eureka服务和接口定义

    服务注册 EurekaServer Eureka服务模块只有三个文件, 分别是pom.xml, application.yml 和 EurekaServerApplication.java, 内容如下 ...

  4. Spring Cloud开发人员如何解决服务冲突和实例乱窜?(IP实现方案)

    一.背景 在我上一篇文章<Spring Cloud开发人员如何解决服务冲突和实例乱窜?>中提到使用服务的元数据来实现隔离和路由,有朋友问到能不能直接通过IP来实现?本文就和大家一起来讨论一 ...

  5. Spring cloud项目实践(一)

    链接地址:http://sail-y.github.io/2016/03/21/Spring-cloud%E9%A1%B9%E7%9B%AE%E5%AE%9E%E8%B7%B5/ 什么是Spring ...

  6. spring cloud 微服务架构 简介

     Spring Cloud 1. Spring Cloud 简介 Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集,为开发人员提供快速建立分布式系统中的 ...

  7. Spring Cloud及微服务简介

    最近在看微服务编排的东西,看到一篇入门博客,私以为不错,再次分享下:https://blog.csdn.net/w05980598/article/details/79007194 什么是微服务 微服 ...

  8. spring/spring boot/spring cloud开发总结

    背景        针对RPC远程调用,都在使用dubbo.dubbox等,我们也是如此.由于社区暂停维护.应对未来发展,我们准备尝试新技术(或许这时候也不算什么新技术了吧),选择使用了spring ...

  9. Spring cloud开发内存占用过高解决方法

    https://blog.csdn.net/wanhuiguizong/article/details/79289986 版权声明:本文为博主原创文章,转载请声明文章来源和原文链接. https:// ...

随机推荐

  1. 基于Otsu算法的图像自适应阈值切割

    在图像处理实践中,将灰度图转化为二值图是非经常见的一种预处理手段. 在Matlab中,能够使用函数BW = im2bw(I, level)来将一幅灰度图 I.转化为二值图. 当中.參数level是一个 ...

  2. [转]HTTPS网络流量解密方法探索系列(一)

    前言 分析网络流量总是绕不开HTTPS,因其广泛使用甚至是强制使用逐渐被大众熟知,在保证其安全的同时也提高了对流量进行研究的难度.目前解析HTTPS协议的文章很多,有很多不错的文章可以带着入门,老实说 ...

  3. DNS预解析dns-prefetch提升页面载入速度优化前端性能

    当浏览器请求一个URL的时候,通过firebug我们可以发现大概有以下几个过程:阻挡.域名解析.建立连接.发送请求.等待响应.接收数据.后面四个跟用户的网络情况和你的服务器处理速度有关,本文重点说说前 ...

  4. GetTextMetrics与GetTextExtent的区别

    GetTextMetrics:获取当前字体的信息 GetTextExtent:获取特定的字符串在屏幕上所占的宽度和高度 CDC::GetTextMetrics 作用: 返回当前设备描述表中的当前所用的 ...

  5. bash: php: command not found

    bash: php: command not found 解决:export PATH=$PATH:/usr/local/php/bin

  6. 【Scala】Scala学习资料

    Scala学习资料 java 树形 分类器_百度搜索 决策树分类器-Java实现 - CSDN博客 KNN分类器-Java实现 - CSDN博客 学习:java设计模式—分类 - 飞翔荷兰人 - 博客 ...

  7. 前端开发必备 40款优秀CSS代码编写工具推荐

    摘要:CSS工具可以简化工作流,可以提高CSS编写速度,是开发者和设计者所不可缺少的.本文列举了40种CSS工具,功能涉及CSS菜单.动画.3D图形.响应式页面.图层.按钮等界面元素的设计与制作,你定 ...

  8. Sqlite的多表连接更新

    最近处理一个较大数据的sqlite库,基础表300万条,结果表30万条左右,我的笔记本跑起来还算流畅.最后结果,需要两个表连接,把另一个表的计算结果更新过来,却遇到麻烦.sqliter并不支持常见的连 ...

  9. LXC 容器集chroot使用说明

    1.1 LXC是什么? 1.1.1 关于LXC LXC,其名称来自Linux软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level vi ...

  10. Web - TCP的三次握手

    在TCP/IP协议中,TCP协议提供可靠的连接服务,採用三次握手建立一个连接. 第一次握手:建立连接时,client发送syn包(syn=j)到server,并进入SYN_SENT状态,等待serv ...