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

SpringCloud技术篇(一):什么是SpringCloud?

创建好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端口的服务:

SpringCloud技术篇(一):什么是SpringCloud?

访问8001的项目,这个主要就是我们后端的测试。

由于本地没有启动测试80端口,所以这里就不展示了,80端口的数据是和8001的数据是一样的,就是为了让大家看清楚怎么调用的,自己回去测试把,哈哈!!

在之前有说过每一个微服务就是一个进程,现在大家看看我说的有没有假:

SpringCloud技术篇(一):什么是SpringCloud?

三个java程序呢!! 每个微服务大约占400MB的内存,想一想你的电脑可以启动几个微服务呢?


最后附上源码:https://gitee.com/dsw123/SpringCloud

相关文章:

  • 2021-09-22
  • 2022-12-23
  • 2021-11-14
  • 2021-07-27
  • 2021-09-14
  • 2021-10-31
猜你喜欢
  • 2021-11-15
  • 2022-12-23
  • 2021-08-22
  • 2021-07-07
相关资源
相似解决方案