1,springcloud简介

​ springcloud是分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。实现的功能有服务注册与发现,服务调用,服务熔断,负载均衡,服务降级,服务消息队列,配置中心管理,服务网关,服务监控,全链路追踪,自动化部署。

现在我们常用的五大组件

  1. 服务注册与发现——Eureka
  2. 负载均衡:
    1. 客户端负载均衡——Ribbon
    2. 服务端负载均衡:——Feign
  3. 断路器——Hystrix
  4. 服务网关——Zuul
  5. 分布式配置——Spring Cloud Config

2,微服务的优缺点

优点

  1. 单一职责原则;
  2. 每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个- 指定的业务功能或业务需求;
  3. 开发简单,开发效率高,一个服务可能就是专一的只干一件事;
  4. 微服务能够被小团队单独开发,这个团队只需2-5个开发人员组成;
  5. 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的;
  6. 微服务能使用不同的语言开发;
  7. 易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如jenkins,Hudson,bamboo;
  8. 微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果,无需通过合作才能体现价值;
  9. 微服务允许利用和融合最新技术;
  10. 微服务只是业务逻辑的代码,不会和HTML,CSS,或其他的界面混合;
  11. 每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一的数据库;

缺点

  1. 开发人员要处理分布式系统的复杂性;
  2. 多服务运维难度,随着服务的增加,运维的压力也在增大;
  3. 系统部署依赖问题;
  4. 服务间通信成本问题;
  5. 数据一致性问题;
  6. 系统集成测试问题;
  7. 性能和监控问题;

3,springboot与springcloud的区别

  1. SpringBoot专注于开苏方便的开发单个个体微服务;
  2. SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务,整合并管理起来,为各个微服务之间提供:配置管理、服务发现、断路器、路由、为代理、事件总栈、全局锁、决策竞选、分布式会话等等集成服务;
  3. SpringBoot可以离开SpringCloud独立使用,开发项目,但SpringCloud离不开SpringBoot,属于依赖关系;
  4. SpringBoot专注于快速、方便的开发单个个体微服务,SpringCloud关注全局的服务治理框架;

4,搭建父工程

首先创建父工程(maven),然后添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache/POM/4.0.0"
         xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache/POM/4.0.0 http://maven.apache/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.kuang</groupId>
    <artifactId>springcloud</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--打包方式  pom-->
    <packaging>pom</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <mavenpiler.source>1.8</mavenpiler.source>
        <mavenpiler.target>1.8</mavenpiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>0.2.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springCloud的依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--SpringBoot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.5.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>
            <!--日志测试~-->
            <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>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

5,创建microservicecloud-api 工程

(封装的整体entity/接口/公共配置等)

导入依赖:

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

创建实体类:

//链式写法
@Accessors(chain = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
/**
 * Dept 实体类  orm 类表关系映射
 */
public class Dept implements Serializable {

    /**
     * 主键
     */
    private Long deptno;

    private String dname;

    /**
     * 这个数据存在哪个数据库字段~微服务,一个服务对应一个数据库,同一个信息可能存在不同数据库
     */
    private String db_source;

    /*
     * 链式写法:
     * Dept dept = new Dept();
     * dept.setDeptNo(11).setDname('sss').setDb_source('001');
     *
     * */
}

6,搭建服务提供者工程

服务提供者相当于服务端

创建创建springcloud-provider-dep-8001

然后导入依赖

<dependencies>

    <!--我们需要拿到实体类,所以要配置api module-->
	<dependency>
        <groupId>com.kuang</groupId>
        <artifactId>microservicecloud-api</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
    <!--junit-->
    <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:尝试着用这个当应用服务器,与Tomcat没什么区别-->
    <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>

然后编写一些配置类:

application.yml文件

server:
  port: 8001

#mybatis配置
mybatis:
  # 配置别名
  type-aliases-package: com.yang.springcloud.pojo
  # mybatis的配置文件
  config-location: classpath:mybatis/mybatis-config.xml
  # 编写sql语句的配置文件
  mapper-locations: classpath:mybatis/mapper/*.xml

#spring配置
spring:
  application:
    # 服务的名称
    name: springcloud-provider-dept
    # 数据源的配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSourceC3P0Adapter
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql://localhost:3306/clouddb01?useUnicode=true&characterEncoding=UTF-8
    username: root
    password: ***

mybatis的配置文件mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis//DTD Config 3.0//EN"
        "http://mybatis/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!--开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

dao层:

@Mapper
@Repository
public interface DeptDao {

    /**
     * 插入数据
     * @param dept 部门对象
     * @return 返回是否插入成功
     */
    public boolean addDept(Dept dept);

    /**
     * 根据id查询部门信息
     * @param id 部门id
     * @return 返回部门对象
     */
    public Dept queryById(Long id);

    /**
     * 查询所有的部门信息
     * @return 返回部门信息组成的列表
     */
    public List<Dept> queryAll();

}

mapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis//DTD Config 3.0//EN"
        "http://mybatis/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.springcloud.dao.DeptDao">

    <insert id="addDept" parameterType="com.kuang.springcloud.pojo.Dept">
        insert into dept (dname,db_source)
        values (#{dname},DATABASE());
    </insert>

    <select id="queryById" resultType="com.kuang.springcloud.pojo.Dept">
        select *
        from dept
        where deptno = #{deptno};
    </select>

    <select id="queryAll" resultType="com.kuang.springcloud.pojo.Dept">
        select * from dept;
    </select>

</mapper>

service层:

public interface DeptService {

    /**
     * 插入数据
     * @param dept 部门对象
     * @return 返回是否插入成功
     */
    public boolean addDept(Dept dept);

    /**
     * 根据id查询部门信息
     * @param id 部门id
     * @return 返回部门对象
     */
    public Dept queryById(Long id);

    /**
     * 查询所有的部门信息
     * @return 返回部门信息组成的列表
     */
    public List<Dept> queryAll();
}
@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private 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 deptDao.queryAll();
    }
}

controller层:

//提供Restful服务
@RestController
public class DeptController {

    @Autowired
    private DeptService deptService;

    @PostMapping("/dept/add")
    public boolean addDept( Dept dept){
        return deptService.addDept(dept);
    }

    @GetMapping("/dept/get/{id}")
    public Dept queryById(@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);
    }
}

然后启动主启动类进行测试:访问http://localhost:8001/dept/list

出现下面的示例表示服务提供者创建成功

7,搭建服务消费者工程

创建springcloud-consumer-dept-80

导入依赖:

<dependencies>
	<dependency>
        <groupId>com.kuang</groupId>
        <artifactId>microservicecloud-api</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

编写yaml文件

server:
  port: 80

创建消费者的bean

@Configuration
public class ConfigBean {

    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

编写服务消费者的controller

@RestController
public class DeptConsumerController {

    /**
     *   理解:消费者,不应该有service层
     *   RestTemplate ... 供我们直接调用就可以了!
     *   (url,实体:map,Class<T> responseType)
     */

    /**
     * 提供多种便捷访问远程http服务的方法,简单的Restful服务模板~
     */
    @Autowired
    private RestTemplate restTemplate;

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

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

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

    @RequestMapping("/customer/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://localhost/customer/dept/list

出现下面的页面说明创建成功:

这个时候我们明明访问的是服务消费者,但是我们依然是可以到达服务消费者的页面,这个就显示了服务的调用

上述资料参考了狂神的springcloud视频

更多推荐

SpringCloud-springcloud简介