基于《狂神说Java》SpringCloud --学习笔记

前言:

本笔记仅做学习与复习使用,不存在刻意抄袭。参考于学友菜鸟小杰子

给各位学友强烈推荐《遇见狂神》他的整套Java学习路线使我获益匪浅!!!

点击跳转至遇见狂神说哔哩哔哩首页

如果你也是狂神的小迷弟,可以加我好友一起探讨学习。


目录

前言:

浅谈微服务

什么是微服务

微服务的优点

微服务的缺点

微服务架构4个核心问题

SpringCloud入门概述

什么是SpringCloud

SpringCloud和SpringBoot的关系

Dubbo 和 SpringCloud技术选型

SpringCloud Rest学习环境搭建:服务提供者

介绍

SpringCloud版本选择

搭建项目

创建父工程

创建实体类(pojo)类和创建数据库

结合mybatis

springcloud-consumer-dept-80访问springcloud-provider-dept-8001下的controller使用REST方式

SpringCloud分布式开发五大神兽

Eureka服务注册中心

什么是Eureka

原理理解

Eureka基本的架构

 三大角色

构建步骤

Eureka:集群环境配置

Eureka:CAP原则及对比Zookeeper

Ribbon:负载均衡(基于客户端)

ribbno是什么

ribbon能干什么?

集成ribbon 在的消费者客户端

使用Ribbon实现负载均衡

Ribbon 自定义负载均衡算法

Feign负载均衡(基于服务端)

Feign 简介

Feign 能干什么

Ribbon和Feign的区别

Feign的使用步骤

Hystrix 服务熔断

分布式系统面临的问题

服务雪崩

什么是Hystrix

Hystrix能干什么

服务熔断

Hystrix服务熔断环境搭建

实例

Hystrix 服务降级

什么是服务降级

入门案例

Hystrix服务熔断和降级对比

Hystrix:Dashboard流监控

Zuul 路由网关

什么是Zull

Zuul能干什么

为什么要建立Zuul

Zuul组件

Zuul路由网关 项目搭建

SpringCloud config分布式配置

概述

分布式系统面临的 —— 配置文件的问题

什么是Springcloud config分布式配置中心

SpringCloud config分布式配置中心能干嘛

springcloud config环境搭建配置

服务端连接Git配置

客户端连接服务端访问远程

提交远程仓库

客户端连接服务端访问远程配置

远程配置实战测试


浅谈微服务

什么是微服务

  • 整体部署:每一个模块的变更很难不影响到其他模块,使得变更周期变得漫长,扩展需要整体扩展,而不能进行部分扩展。
  • 就目前而言,对于微服务,业界并没有一个统一的,标准的定义。
  • 但通常而言,微服务架构是一种架构模式,或者说是一种架构风格,它提倡将单一的应用程序划分成一组小的服务,每个服务运行在其独立的自己的进程内,服务之间互相协调,互相配置,为用户提供最终价值,服务之间采用轻量级的通信机制(HTTP)互相沟通,每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境中,另外,应尽量避免统一的,集中式的服务管理机制,对具体的一个服务而言,应该根据业务上下文,选择合适的语言,工具(Maven)对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。
  • 微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事情,从技术角度看就是一种小而独立的处理过程,类似进程的概念,能够自行单独启动或销毁,拥有自己独立的数据库。
     

微服务的优点

  • 单一职责原则;
  • 每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个指定的业务功能或业务需求;
  • 开发简单,开发效率高,一个服务可能就是专一的只干一件事;
  • 微服务是松耦合的;
  • 微服务能使用不同的语言开发。根据不同需求使用不同数据库;

微服务的缺点

  • 分布式系统复杂
  • 数据一致性问题
  • 运维难度大

微服务架构4个核心问题

1.服务很多,客户端该怎么访问?
2.这么多服务?服务之间如何通信?
3.这么多服务? 如何治理?
4.服务挂了怎么办?

SpringCloud是生态 是一个解决方案 例如小米公司的生态
1.Spring cloud NetFlix(重点
2.Apache Dubbo Zookeeper
3.Spring cloud Alibaba
解决以上四个核心问题

在这里插入图片描述

在这里插入图片描述

SpringCloud入门概述

什么是SpringCloud

  • Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案。
  • Spring Cloud对微服务基础框架Netflix的多个开源组件进行了封装,同时又实现了和云端平台以及和Spring Boot开发框架的集成。
  • Spring Cloud为微服务架构开发涉及的配置管理,服务治理,熔断机制,智能路由,微代理,控制总线,一次性token,全局一致性锁,leader选举,分布式session,集群状态管理等操作提供了一种简单的开发方式。
  • Spring Cloud 为开发者提供了快速构建分布式系统的工具,开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接。
     

SpringCloud和SpringBoot的关系

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

Dubbo 和 SpringCloud技术选型

对比结果

Dubbo SpringCloud
服务注册中心 Zookeeper Spring Cloud Netfilx Eureka
服务调用方式 RPC REST API
服务监控 Dubbo-monitor Spring Boot Admin
断路器 不完善 Spring Cloud Netfilx Hystrix
服务网关 Spring Cloud Netfilx Zuul
分布式配置 Spring Cloud Config
服务跟踪 Spring Cloud Sleuth
消息总栈 Spring Cloud Bus
数据流 Spring Cloud Stream
批量任务 Spring Cloud Task

最大区别:Spring Cloud 抛弃了Dubbo的RPC通信,采用的是基于HTTP的REST方式

严格来说,这两种方式各有优劣。虽然从一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这个优点在当下强调快速演化的微服务环境下,显得更加合适。

SpringCloud Rest学习环境搭建:服务提供者

  1. 填写配置文件时注意观察右上角的配置信息
  2. springcloud再没继承父类的时要留意jar包是否成功导入

每项微服务的大体流程:

  1. 导入依赖
  2. 编写配置文件
  3. 开启功能 @enablexxx
  4. 配置类

介绍

  • 我们会使用一个Dept部门模块做一个微服务通用案例Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务。
  • 回顾Spring,SpringMVC,Mybatis等以往学习的知识。
  • Maven的分包分模块架构复习。

一个简单的Maven模块结构是这样的:
-- app-parent: 一个父项目(app-parent)聚合了很多子项目(app-util\app-dao\app-web...)
  |-- pom.xml
  |
  |-- app-core
  ||---- pom.xml
  |
  |-- app-web
  ||---- pom.xml
  ......

SpringCloud版本选择

注意版本依赖说明:https://docs.spring.io/spring-cloud/docs/

SpringBoot SpringCloud 关系
1.2.x Angel版本(天使) 兼容SpringBoot1.2x
1.3.x Brixton版本(布里克斯顿) 兼容SpringBoot1.3x,也兼容SpringBoot1.4x
1.4.x Camden版本(卡姆登) 兼容SpringBoot1.4x,也兼容SpringBoot1.5x
1.5.x Dalston版本(多尔斯顿) 兼容SpringBoot1.5x,不兼容SpringBoot2.0x
1.5.x Edgware版本(埃奇韦尔) 兼容SpringBoot1.5x,不兼容SpringBoot2.0x
2.0.x Finchley版本(芬奇利) 兼容SpringBoot2.0x,不兼容SpringBoot1.5x
2.1.x Greenwich版本(格林威治)

搭建项目

创建父工程

<!--打包方式为pom-->
<packaging>pom</packaging>
  • 新建父工程项目springcloud,切记Packageing是pom模式
  • 主要是定义POM文件,将后续各个子模块公用的jar包等统一提取出来,类似一个抽象父类

pom.xml

<?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>org.example</groupId>
    <artifactId>springcloud</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>springcloud-api</module>
        <module>springcloud-provider-dept-8001</module>
        <module>springcloud-consumer-dept-80</module>
        <module>springcloud-eureka-7001</module>
        <module>springcloud-eureka-7002</module>
        <module>springcloud-eureka-7003</module>
        <module>springcloud-provider-dept-8002</module>
        <module>springcloud-provider-dept-8003</module>
        <module>springcloud-consumer-dept-feign</module>
        <module>springcloud-provider-dept-hystrix-8001</module>
        <module>springcloud-consumer-hystrix-dashboard</module>
        <module>springcloud-zuul-9527</module>
        <module>springcloud-config-server-3344</module>
        <module>springcloud-config-client-3355</module>
        <module>springcloud-config-eureka-7001</module>
        <module>springcloud-config-dept-8001</module>
    </modules>
    <!--打包方式为pom-->
    <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依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springboot依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.4.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>
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <!--log4j-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}}</version>
            </dependency>
            <!--lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

父工程为springcloud,其下有多个子mudule

 最终项目结构图

创建实体类(pojo)类和创建数据库

 pom.xml

 <!--当前的module自己需要的依赖,如果父依赖已经配置了版本这里就不用写-->
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
    </dependencies>

这个模块只需要创建实体类,只需要导入lombok方便构建实体类即可。

pojo类

@Data
@NoArgsConstructor
@Accessors(chain = true) // 链式写法
public class Dept implements Serializable {
    private Long deptno;
    private String dname;
    //每个数据存在哪个数据库的字段~微服务,一个服务对应一个数据量,同一个信息可能存在不同的数据库
    private String db_source;
}

注意一下@Accessors(chain = true),链式编程的原理就是返回一个this对象,就是返回本身,达到链式效果。链式写法是:

new Dept()
     .setDeptno(id)
     .setDname("kuangshen");

数据库

结合mybatis

provider(提供者)

pom.xml

    <dependencies>
        <!--我们需要拿到实体类,所以要配置api module-->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </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>
        <!--test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--jetty-->
        <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>
server:
  port: 8001
# mybatis配置
mybatis:
  type-aliases-package: com.kuang.springcloud.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

# spring配置
spring:
  application:
    name: springcloud-provider-dept
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf8  #8版本以上需要加上时区配置serverTimezone=GMT%2B8
    username: root
    password: root #(你的MySQL密码)

编写配置文件

在这里插入图片描述

 DeptMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper        
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.springcloud.dao.DeptDao">  
  
    <insert id="addDept" parameterType="Dept">        
        insert into dept (dname, db_source)        
        values (#{dname}, DATABASE())    
    </insert>    
    <select id="queryById" resultType="Dept" parameterType="Long">        
        select *  from dept where deptno = #{deptno}    
    </select>    
    <select id="queryAll" resultType="Dept">        
        select * from dept    
    </select>
</mapper>

mybatis-config.xml

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

就开个缓存,表示下他的存在就好。

dao层

@Mapper

作用:用在接口类上,在编译之后会生成相应的接口实现类
位置:对应的某个接口类上面

@Mapper
@Repository
public interface DeptDao {    
    /**
    *插入操作
    */
    public boolean addDept(Dept dept);   
    /**
    *通过id查询操作
    */ 
    public Dept queryById(Long id);   
    /**
    *查询全部操作
    */
    public List<Dept> queryAll();
}

service

public interface DeptService {    
    public boolean addDept(Dept dept);    
    public Dept queryById(Long id);    
    public List<Dept> queryAll();
}

serviceImpl

@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();   
     }
}
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值