前言

最近入职了新公司,主要负责Java后端开发工作。目前正在开展一个全新的业务,技术选型为SpringCloud全家桶,项目的骨架由我负责搭建。由于前几家公司的微服务框架都是使用Dubbo + SpringBoot,然后平时对SpringCloud 这一套了解不多。这两天正好有时间可以研究下SpringCloud如何使用、SpringCloud 如何与其他组件整合。

一、SpringCloud简介

SpringCloud 是基于SpringBoot提供一整套的微服务解决方案,包括服务注册与发现、配置中心、消息总线、服务网关、负载均衡、熔断器、全链路监控等组件。除了Netfix提供的开源组件外,还有一些第三方的开源组件可以使用。

开发者可以很方便的将微服务中常用组件无缝整合进SpringCloud中,然后通过SpringBoot风格进行封装和屏蔽掉底层复杂的配置和实现原理,非常容易上手。简单来说,SpringCloud 就是分布式微服务的一站式解决方案,俗称SpringCloud全家桶。

二、SpringCloud和SpringBoot的关系

  • SpringBoot: 专注于方便快速开发单个微服务系统。
  • SpringCloud: 微服务系统协调治理框架,就是将SpringBoot开发的多个微服务管理起来。
  • SpringBoot 可以不依赖SpringCloud独立使用,而SpringCloud的使用一定离不开SpringBoot。

三、项目搭建

3.1 环境准备

  • 开发工具IDEA
  • JDK1.8
  • Apache Maven 3.5.2,使用阿里云镜像
  • SpringBoot 2.1.3.RELEASE 版本
  • SpringCloud Greenwich.SR1 版本

3.2 父项目

创建一个名称为 spring-cloud-parent 的pom项目。主要是用来管理SpringBoot、SpringCloud,及其他各种jar 包依赖。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.gallenzhang</groupId><artifactId>spring-cloud-parent</artifactId><version>1.0.0-SNAPSHOT</version><packaging>pom</packaging><name>spring-cloud-parent</name><properties><spring-boot.version>2.1.3.RELEASE</spring-boot.version><spring-cloud.version>Greenwich.SR1</spring-cloud.version><spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version><mybatis-spring-boot.version>2.1.2</mybatis-spring-boot.version><mysql.version>5.1.26</mysql.version><lombok.version>1.18.12</lombok.version><java.version>1.8</java.version></properties><dependencyManagement><dependencies><!-- spring-boot 依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- spring-cloud 依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- spring-cloud-alibaba 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!-- mybatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis-spring-boot.version}</version></dependency><!-- mysql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>${spring-boot.version}</version><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies></dependencyManagement><!-- SpringBoot打包插件,可以将代码打包成一个可执行的jar包 --><build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork><addResources>true</addResources></configuration></plugin></plugins></build>
</project>

3.3 服务注册中心

创建一个名称为spring-cloud-eureka的项目,作为服务注册中心。这里使用eureka 来管理服务的注册和发现,工程的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><parent><groupId>com.gallenzhang</groupId><artifactId>spring-cloud-parent</artifactId><version>1.0.0-SNAPSHOT</version><relativePath /></parent><groupId>com.gallenzhang</groupId><artifactId>spring-cloud-eureka</artifactId><version>1.0.0-SNAPSHOT</version><name>spring-cloud-eureka</name><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

在启动类上加 @EnableEurekaServer表明这是个eureka sever。

/*** <p>* Eureka 启动类* </p>** @author gallenzhang* @since 2020/6/20**/
@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudEurekaApplication.class, args);}
}

默认情况下eureka server 也是一个eureka client,所以eureka.client.register-with-eureka 和 eureka.client.fetch-registry属性都配置为false,表明自己是一个eureka server。配置文件application.yml 内容如下:

server:port: 8000spring:application:name: spring-cloud-eurekaeureka:instance:hostname: localhostclient:#是否将自己注册到Eureka Server,默认为trueregister-with-eureka: false#是否从Eureka Server获取注册信息,默认为truefetch-registry: falseserviceUrl:#服务注册的URLdefaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

右键直接运行SpringCloudEurekaApplication类,启动完成后浏览器访问 http://127.0.0.1:8000/

看到这个页面表示 eureka 已经启动成功,这里的 No instances available 表示目前没有服务提供者注册上来。

3.4 服务提供者

创建一个名称为 spring-cloud-provider的项目,在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><parent><groupId>com.gallenzhang</groupId><artifactId>spring-cloud-parent</artifactId><version>1.0.0-SNAPSHOT</version><relativePath /></parent><groupId>com.gallenzhang</groupId><artifactId>spring-cloud-provider</artifactId><version>1.0.0-SNAPSHOT</version><name>spring-cloud-provider</name><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

配置文件application.yml 内容如下:

server:port: 8100spring:application:name: spring-cloud-provider #服务之间的调用都是根据这个 nameeureka:client:serviceUrl:defaultZone: http://localhost:8000/eureka/

为了方便测试,项目新建一个HelloController 类

/*** <p>* Hello Controller* </p>** @author gallenzhang* @since 2020/6/20**/
@RestController
public class HelloController {@Value("${server.port}")private String port;@RequestMapping("/hello")public String sayHello(@RequestParam(value = "name", defaultValue = "gallenzhang") String name){return "hello " + name + " , I am from port:" + port;}
}

启动类添加@EnableEurekaClient 注解

/*** <p>* 提供者启动类* </p>** @author gallenzhang* @since 2020/6/20**/
@SpringBootApplication
@EnableEurekaClient
public class SpringCloudProviderApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudProviderApplication.class, args);}
}

右键运行SpringCloudProviderApplication,将提供者注册到eureka上去。此时访问 http://127.0.0.1:8000/

服务提供者已经注册到 eureka 上了,服务名称就是 spring.application.name 值的大写。

浏览器访问 http://localhost:8100/hello?name=allen ,在浏览器上可以看到响应结果。

hello allen , I am from port:8100

3.5 服务消费者

Feign 是一个声明式的伪Http客户端,使用它只要创建一个接口并添加@FeignClient注解即可,它使得写Http客户端变得简单。Feign默认集成了Ribbon,并和 eureka 结合,实现了客户端负载均衡。

创建一个名称为 spring-cloud-consumer的项目,在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><parent><groupId>com.gallenzhang</groupId><artifactId>spring-cloud-parent</artifactId><version>1.0.0-SNAPSHOT</version><relativePath /></parent><groupId>com.gallenzhang</groupId><artifactId>spring-cloud-consumer</artifactId><version>1.0.0-SNAPSHOT</version><name>spring-cloud-consumer</name><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

配置文件application.yml 内容如下:

server:port: 8200spring:application:name: spring-cloud-consumer #服务之间的调用都是根据这个nameeureka:client:serviceUrl:defaultZone: http://localhost:8000/eureka/

在程序的启动类SpringCloudConsumerApplication ,加上@EnableFeignClients注解开启 Feign 的功能。

/*** <p>* 消费者启动类* </p>** @author gallenzhang* @since 2020/6/20**/
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class SpringCloudConsumerApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudConsumerApplication.class, args);}
}

定义一个接口,通过@FeignClient来指定调用哪个服务。这里指定了调用 spring-cloud-provider 服务的 hello 接口。

/*** <p>* Hello Client* </p>** @author gallenzhang* @since 2020/6/20**/
@FeignClient(value = "spring-cloud-provider")
public interface HelloClient {/*** 客户端调用服务* @param name* @return*/@RequestMapping(value = "/hello")String sayHelloFromClient(@RequestParam(value = "name") String name);
}

在 Controller 层对外暴露一个 /hello 的Api接口,Controller中通过上面定义的HelloClient来消费服务。

/*** <p>* Hello Controller* </p>** @author gallenzhang* @since 2020/6/20**/
@RestController
public class HelloController {@Autowiredprivate HelloClient helloClient;@RequestMapping(value = "/hello")public String sayHello(@RequestParam String name) {return helloClient.sayHelloFromClient(name);}
}

启动 spring-cloud-eureka 服务。 修改 spring-cloud-provider 项目 application.yml文件中 server.port值,分别启动三次,端口号依次为 8100、8101、8102。

然后右键运行SpringCloudConsumerApplication,启动消费者服务。

浏览器访问 http://127.0.0.1:8200/hello?name=allen 浏览器会交替输出。

hello allen , I am from port:8100
hello allen , I am from port:8101
hello allen , I am from port:8102

源码下载:https://github.com/gallenzhang/spring-cloud-example

四、学习资料

SpringCloud 官网

SpringCloud 中文网

SpringCloud 开发指南-英文版

本文主要参考如下两篇文章。

Spring Cloud 快速入门

史上最简单的 SpringCloud 教程 | 终章

springcloud项目打包_SpringCloud 快速入门相关推荐

  1. SpringCloud项目打包部署

    SpringCloud项目打包部署 1.父模块用maven 的 Lifecycle 2.打包 生成jar 3.至此SpringCloud打包完成 ,运行jar包 1.父模块用maven 的 Lifec ...

  2. SpringCloud项目打包Docker镜像并发布到Harbor仓库

    SpringCloud项目打包Docker镜像并发布到Harbor仓库 1. Docker-compose安装 2. Harbor仓库搭建 3. Docker环境配置 4. 项目配置 1. Docke ...

  3. SpringCloud实战与原理---快速入门

    SpringCloud实战与原理 第一章  快速入门 1. 初始化工程 2. 启动Eureka注册中心 2.1 Eureka注册中心启动代码 2.2 启动Eureka注册中心 3. 注册Eureka客 ...

  4. Python - - 项目实战 -- pygame 快速入门

    目标 1,项目准备 2,使用 pygame 创建图形窗口 3,理解 图像 并实现图像绘制 4,理解 游戏循环 和 游戏时钟 5,理解 精灵 和精灵组** 项目准备 1,新建 飞机大战 项目 2,新建一 ...

  5. java restful项目打包_构建入门Restful Web服务

    创建资源类 假设你已经设置了项目和构建系统,你可以创建Web服务. 通过考虑服务交互来开始这个过程. 该服务将处理GET请求/greeting,可选地使用name查询字符串中的参数.该GET请求应该返 ...

  6. .Net5 WPF快速入门系列教程

    一.概要 在工作中大家会遇到需要学习新的技术或者临时被抽调到新的项目当中进行开发.通常这样的情况比较紧急没有那么多的时间去看书学习.所以这里向wpf技术栈的开发者分享一套wpf教程,基于.net5框架 ...

  7. 【UE4学习】02——C++编程快速入门

    官方文档教程:点击打开链接 在本教程的过程中,我们会创建新的虚幻引擎项目,向其添加新的C++类,然后编译项目并添加新类的实例到关卡中. 在完成后,我们会看到以C++来编程的Actor在屏幕上的移动. ...

  8. SpringCloud五大神兽快速入门

    Spring Cloud 单一应用架构 :主要解决ORM 数据库访问层. 垂直应用架构 : 解决分层问题,实现应用的分层开发,提升开发效率. 分布式应用架构:解决系统间调用问题,引发了SOA(面向服务 ...

  9. SpringCloud——Gateway(介绍、快速入门、网关集群)

    介绍 网关是微服务最边缘的服务,直接暴露给用户,用来做用户和微服务的桥梁. Gateway是Spring官方提供的用来代替zuul的网关组件 核心逻辑:路由转发 + 执行过滤器链 三大核心概念 Rou ...

最新文章

  1. 欧盟无条件批准甲骨文收购Sun
  2. 富人和穷人的对比图,时刻提醒自己!
  3. db2 最大分区数_db2 查询表分区数据库
  4. pandas学习笔记三之赋值操作
  5. layui Table分页之后查询bug
  6. 编程书籍阅读随谈(第一篇)
  7. 【线性代数公开课MIT Linear Algebra】 第六课 AX=b与列空间、零空间
  8. scrollview 中用listview的方法
  9. Python Tricks(四)—— list of lists 的flatten
  10. 计算机专业学生专利,2019.6 电子与计算机工程学院学生喜获三项国家专利
  11. org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.itheima.
  12. LAMMPS分子动力学模拟技术与应用 第一性原理计算方法及应用
  13. 【货干】Idea 安装 MyBatis 插件
  14. 学习python基础(六)
  15. h5页面生成图片分享到微信js_H5网页实现微信分享功能
  16. 第五(模块、包说明)
  17. ESLint 与 Prettier使用
  18. 小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖
  19. Xcode Missing file的解决方案
  20. 知物由学 | SO VMP 加壳与混淆,为移动应用提供函数级保护

热门文章

  1. go 方法接受者 是指针类型和非指针类型的 区别
  2. C#/Net代码精简优化技巧
  3. 智能合约开发环境搭建及Hello World合约
  4. greenplum:空值转换函数
  5. SharePoint 2013 调用WCF服务简单示例
  6. 获取指定路径文件方法
  7. POJ-1129 Channel Allocation DFS搜索
  8. 软件定义的数据中心-【软件和信息服务】2012.11
  9. Php 获取xml中的节点值
  10. 给DataGrid添加自动增长的序列号