1.什么是SpringCloud?
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。简而言知SpringCloud就是一组框架的容器,里面包含了Spring公司提供的各种框架,每一个微服务都是一个进程,所以内存条8G以下的小伙伴们要加内存条了哟,因为我到后面动不动就启动8-10个微服务。
2.SpringCloud和SpringBoot的关系
SpringCloud是依赖于SpringBoot的一组框架集合,SpringCloud的开发是基于SpringBoot的,也就是说没有SpringBoot就搭建不了SpringCloud而SpringBoot被称为微服务中的单独一种服务,所以SpringBoot是可以单独存在开发的。
3.SpringCloud的组成
Spring Cloud的子项目,大致可分成两类,一类是对现有成熟框架"Spring Boot化"的封装和抽象,也是数量最多的项目;第二类是开发了一部分分布式系统的基础设施的实现,如Spring Cloud Stream扮演的就是kafka, ActiveMQ这样的角色。对于我们想快速实践微服务的开发者来说,第一类子项目就已经足够使用,如:
- SpringCloud Netflix是对Netflix框架的一套框架,包括服务发现、负载均衡、断路器、路由、REST客户端等。
- SpringCloud Config将配置信息中央化的保存,配置SpringCloud Bus可以动态修改配置文件。
- SpringCloud Security对Spring Security的封装,并能配合Netflix使用
- Spring Cloud Zookeeper对Zookeeper的封装,使之能配置其它Spring Cloud的子项目使用
- Spring Cloud EurekaSpring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能。
在这我们着重讲解SpringCloud Netflix和SpringCloud Config因为这两种子项目就能满足我们开发的需要,所以着重讲解着两种。
4.为什么使用SpringCloud?
由于中小型公司没有实力和经济去开发像阿里的Duboo和当当网的Duboox,所以SpringCloud的出现就是我们中小型公司的福音,使用SpringCloud的“一站式”解决方案能在从容应对业务发展的同时大大的减少开发成本。同时由于阿里的Duboo的创造者也就是开发Duboo的开发人员在这几年并没有更新Duboo,当当网也被收购了又随着SpringCloud的功能强大,让SpringCloud在微服务领域中有了一席之地,在使用我们的SpringCloud的时候可以解决所有微服务带来的问题,让SpringCloud在开发中获得了好评。
5.如何使用SpringCloud?
讲了这么多的理论知识,现在就进行我们的实操,毕竟只有实践才能知道真理,我这次使用的版本JAR包的版本是Dalston.SR1是不是感觉版本号有点奇怪?没错,SpringCloud的版本号名称是由伦敦的地铁站的名称来定义的,这个一定要记住,说不定面试就问了呢,由于SpringCloud是基于SpringBoot的微服务,所以我们先要搭建SpringBoot这次我使用SpringBoot的版本是1.5.9.RELEASE,废话不多说 现在就开始我们的SpringCloud之旅把!
首先创建我们的Maven父工程microservicecloud
创建好Maven父工程之后第一步配置pom.xml 最重要的!!!一定要记住写项目之前先配置pom.xml,我们总得要有了架构才能编写代码把!
<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.binhua</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<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>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
</properties>
<dependencyManagement>
<dependencies>
<!--SpringCloud Jar包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringBoot Jar包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--MySql Jar包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.4</version>
</dependency>
<!--alibaba连接池 Jar包-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.31</version>
</dependency>
<!--SpringBoot整合Mybatis Jar包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>microservicecloud</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<!--配置$标识符-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<delimit>$</delimit>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>
</project>
第二步:创建子模块microservicecloud-api、microservicecloud-provider-dept-8001、microservicecloud-consumer-dept-80
右击父工程new一个module还是选择Maven
microservicecloud-api作为两个服务端的公共API模块,端口号为8001为微服务的提供者、端口号为80的作为微服务的调用者接下来配置几个模块:
Api模块只需创建我们公用的实体类外不需要配置任何步骤,以下为8001、的配置,还是先配置我们的pom文件:
<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.binhua</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-provider-dept-8001</artifactId>
<dependencies>
<!-- 引入自己定义的api通用包,可以使用Dept部门Entity -->
<dependency>
<groupId>com.binhua</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- actuator监控信息完善 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 将微服务provider侧注册进eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</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-starter-jetty</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-test</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
然后在编写application.yml文件,配置SpringBoot:
server:
port: 8001 #端口号对应不同的项目 比如8001就配置8001 8002就配置8002
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: com.binhua.entity # 所有Entity别名类所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
application:
name: microservicecloud-dept #此处表示微服务的名称
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://localhost:3306/db1 # 数据库名称
username: root
password: 123
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
最后编写三层架构和SpringBoot启动类 我们以通过ID查询为例,使用get方法,我们的两个微服务提供者就配置好了,接下来配置微服务的消费者也就是调用微服务的客户端:
首先也是配置pom:
<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.binhua</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-consumer-dept-80</artifactId>
<description>部门微服务消费者</description>
<dependencies>
<dependency><!-- 自己定义的api -->
<groupId>com.binhua</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
接下来配置application.yml配置很简单,只需配置service的端口号为80。
最后编写java代码使用RestTemplate调用微服务提供者:
package com.binhua.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ConfigBean {
@Bean
public RestTemplate gerRestTemplate(){
return new RestTemplate();
}
}
package com.binhua.controller;
import com.binhua.entity.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class DeptController_Consume {
private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT";
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value="/consumer/dept/add")
public boolean add(Dept dept){
return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add", dept, Boolean.class);
}
@RequestMapping(value="/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id){
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);
}
@SuppressWarnings("unchecked")
@RequestMapping(value="/consumer/dept/list")
public List list()
{
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);
}
}
这样一个简单的SpringCloud微服务就配置完成了。
6.测试微服务
启动8001、80端口的服务:
访问8001的项目,这个主要就是我们后端的测试。
由于本地没有启动测试80端口,所以这里就不展示了,80端口的数据是和8001的数据是一样的,就是为了让大家看清楚怎么调用的,自己回去测试把,哈哈!!
在之前有说过每一个微服务就是一个进程,现在大家看看我说的有没有假:
三个java程序呢!! 每个微服务大约占400MB的内存,想一想你的电脑可以启动几个微服务呢?
最后附上源码:https://gitee.com/dsw123/SpringCloud