springcloud-springcloud简介(代码片段)

拾忆最初的理想 拾忆最初的理想     2023-03-31     534

关键词:

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.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.kuang</groupId>
    <artifactId>springcloud</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--打包方式  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>
            <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.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
@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.org//DTD Config 3.0//EN"
        "http://mybatis.org/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(springcloud-springcloud根/父项目,开发准备(代码片段)

一、SpringCloud开发项目工程说明在后续的SpringCloud工程项目开发,以及博文中,都要注意此文说明!1、SpringCloud本身并不是一个拿来即可用的框架,它是一套微服务规范,共有两代实现。(1)SpringCloudNet... 查看详情

springcloud-springcloud之stream构建消息驱动微服务框架;springcloudalibaba集成rocketmq(二十四)(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud之Stream构建消息驱动微服务框架;RabbitMQ(十九)_MinggeQingchun的博客-CSDN博客_springcloudstream一、SpringCloudStream在微服务的开发过程中,会经常用到消息中间件,通过消息中间... 查看详情

springcloud-springcloud之config分布式配置;config注册至eureka;集成security安全认证(十七)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125337347https://blog.csdn.net/MinggeQingchun/arti 查看详情

springcloud-springcloud之config分布式配置;加解密;配置信息局部刷新;springcloudbus+rabbitmq全局刷新(十六)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125337347一、加解密在Git仓库中明文存储配置信息值,对于某些敏感... 查看详情

springcloud-springcloud之sleuth分布式链路跟踪;zipkin埋点数据;elasticsearch数据持久化(十八)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、SpringCloudSleuth微服务有几种监控方式,如SpringBootActuator监控微服务,SpringBootAdmin监控微服务,Hy... 查看详情

springcloud-springcloud之security服务安全机制(二十)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客SpringSecurity微服务的Rest服务都是基于http请求的,因此很有可能暴露在公网上,任何人都可能调用访问&#... 查看详情

springcloud-springcloud之gateway网关(十三)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、API网关引自百度百科API网关,软件术语,两个相互独立的局域网之间通过路由器进行通信,中... 查看详情

springcloud-springcloud之zuul和gateway网关(十四)(代码片段)

SpringCloudGateway是SpringCloud的一个子项目。而zuul则是Netflix公司的项目,只是Spring将zuul集成在SpringCloud中使用而已。因为zuul2.0连续跳票和zuul1的性能表现不是很理想,所以催生了spring团队开发了Gateway项目ZuulZuul是netflix公司的... 查看详情

springcloud-springcloud之config分布式配置;server,client配置(十五)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客在分布式微服务系统中,几乎所有服务的运行都离不开配置文件的支持,这些配置文件通常由各个服务... 查看详情

springcloud-springcloud之apolloconfig携程阿波罗配置中心(二十一)(代码片段)

由于SpringCloud自带的Config需要配合Bus使用,且不能实时刷新,因此市面上出现了很多开元的配置中心市面上开源的配置中心Apollo(阿波罗):携程框架部门研发的分布式配置中心,能够集中化管理应用不同... 查看详情

ha简介以及hbase简介

      查看详情

音频处理channelvocoder算法简介

系列文章目录DelayLine简介及其C/C++实现LFO低频振荡器简介及其C/C++实现【音效处理】Delay/Echo算法简介【音效处理】Vibrato算法简介【音效处理】Reverb混响算法简介【音效处理】Compressor压缩器算法简介【音频处理】FastCon... 查看详情

springcloud-springcloudnetflix之ribbon(代码片段)

阅读本文前可先参考 SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客SpringCloudRibbon是一套基于NetflixRibbon实现的客户端负载均衡和服务调用工具Ribbon是Netflix公司发布的开源组件,其主要功... 查看详情

音频处理loudnessnormalization响度均衡算法简介(代码片段)

系列文章目录DelayLine简介及其C/C++实现LFO低频振荡器简介及其C/C++实现【音效处理】Delay/Echo算法简介【音效处理】Vibrato算法简介【音效处理】Reverb混响算法简介【音效处理】Compressor压缩器算法简介【音频处理】FastCon... 查看详情

概念简介javascript简介

【概念简介】Javascript简介Javascript是世界上最流行的脚本编程语言,主要用于Web开发,也可用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。Javascript是一种轻量级的编程语言,可插入HTML页面,由浏览器解释并执行。Jav... 查看详情

2html简介

HTML简介     查看详情

springcloud-springcloudalibaba之gateway集成sentinel(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud之Gateway网关(十三)_MinggeQingchun的博客-CSDN博客_spring.cloud.gateway.routes[0]SpringCloud-SpringCloudAlibaba之Sentinel规则持久化(十)_MinggeQingchun的博客-CSDN 查看详情

androidrenderscriptrenderscript简介①(gpu简介|gpu系统架构)

文章目录一、GPU简介二、GPU系统架构1、传统GPU系统架构2、移动设备GPU系统架构使用RenderScript编写Android平台运行的高性能计算应用程序;RenderScript官方文档:https://developer.android.google.cn/guide/topics/renderscript/compute一、GPU简介图形处理... 查看详情