SpringCloud-springcloud简介-程序员宅基地

技术标签: 微服务  java  spring cloud  框架  

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();
    }
}

编写服务消费者的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视频

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_51604685/article/details/126211587

智能推荐

Matlab在概率统计中的应用问题及解决方案集锦_matlab数学建模 概率题-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏9次。Matlab在概率统计中的应用(0001)问题:假设已知 Rayleigh 分布的概率密度函数为试用解析推导的方法求出该分布的分布函数、均值、方差、中心矩和原点矩。生成一组满足 Rayleigh 分布的伪随机数,用数值方法检验得出的解析结果是否正确。解:工具相应的数学定义的公式,所需的分布函数、均值、方差、中心矩和原点矩等可 以由下面的语句推导出来。>> syms x;syms b positivep=x*exp(-x^2/2/b^2)/b^..._matlab数学建模 概率题

关于一些不同寻常的tabBar的使用_手机app的tabbar能不能占比区域不同-程序员宅基地

文章浏览阅读509次。在实际开发中,系统的原生控件并不能满足我们的需求,这个时候就需要自己去自定义这个控件,自定义控件需要自己对原生控件结构非常了解。今天,这里来讲一下不同寻常的tabBar。原则:尽量利用系统自带的TabBar.只改需要改的地方不同寻常的tabBar 类型一:这种基本上是重写了整个tabbar,然后根据自己的需求来定义view的风格 步骤: 1.把自带的TaBBar条给隐藏掉,添加自己的view l_手机app的tabbar能不能占比区域不同

苹果电脑第一次用pygame创建主窗口卡死的解决方法_pycharm的pygame.display.set_mode很卡怎么办?-程序员宅基地

文章浏览阅读1.3k次,点赞4次,收藏2次。第一次使用pygame写游戏时,我创立窗口的时候遇到了这样的困难。首先给出我出现卡顿原因的代码:import pygamedef main(): screen = pygame.display.set_mode((350, 500), depth=32) background = pygame.image.load('/Users/chenyang0804/Desktop/屏幕快照 2020-08-17 下午8.54.21.png') pygame.display.set_ca_pycharm的pygame.display.set_mode很卡怎么办?

【Unity】Unity Editor中使输入框失去焦点_guiutility.keyboardcontrol-程序员宅基地

文章浏览阅读2.2k次。【Unity】Unity Editor中使输入框失去焦点Unity自定义编辑器窗口时,如果想让当前正在输入文本的输入框失去焦点,必须把焦点移动到另一个输入控件。如果用代码使当前输入框失去焦点的话,很简单,就一行代码:GUIUtility.keyboardControl = 0;..._guiutility.keyboardcontrol

Linux阅码场 - Linux内核月报(2020年06月)-程序员宅基地

文章浏览阅读1.4k次。关于Linux内核月报Linux阅码场Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向。限于篇幅,只会对..._memory tag

随便推点

重识Nginx - 14 Nginx 多进程结构_nginx master process-程序员宅基地

文章浏览阅读3.1w次。kill -SIGTERM关闭worker进程后,会重新起一个worker进程. 该命令是worker提供给master的,通常管理员只需要操作master进程就可以,如果一定要操作worker进程,那么一定是可以确认某一个worker进程出问题了,且信号对应的功能可以解决该问题。Nginx 期望一个worker进程使用一颗cpu, 把某个worker进程和某个cpu绑定在一起,可以更好地使用cpu上的缓存,来减少缓存失效的命中率。Worker进程 处理请求, Master进程管理Worker进程。_nginx master process

最长上升子序列优化(贪心+二分)(超级详细的讲解)-程序员宅基地

文章浏览阅读2.6k次,点赞20次,收藏27次。详细讲解优化的原理,并给出通俗的证明和简单的代码帮助你彻底掌握优化过程!!_最长上升子序列优化

AttributeError: module ‘tensorflow.compat.v1’ has no attribute ‘contrib’_attributeerror: module 'tensorflow' has no attribu-程序员宅基地

文章浏览阅读3.5k次,点赞4次,收藏22次。项目场景:提示:这里简述项目相关背景:AttributeError: module ‘tensorflow.compat.v1’ has no attribute ‘contrib’问题描述提示:这里描述项目中遇到的问题:公司的是3080显卡,跑tensorflow1.x的代码,最终的环境时tensorflow2.6的,运行会报这个错原因分析:提示:这里填写问题的分析:原因是tensorflow1.x的contrib包被整合进了三个包里(据这位大佬说:https://blog.csd_attributeerror: module 'tensorflow' has no attribute 'contrib

学成在线(一)项目介绍_学成在线项目怎么写成简历-程序员宅基地

文章浏览阅读3.4w次,点赞12次,收藏99次。CMS接口开发1 项目的功能构架1.1 项目背景1.2 功能模块1.3 项目原型2 项目的技术架构2.1技术架构2.2 技术栈2.3 开发步骤3 CMS需求分析3.1 什么是CMS3.2 静态门户工程搭建3.2.1 导入门户工程3.2.2 配置虚拟主机 在nginx中配置虚拟主机:3.2.3 SSI服务端包含技术3.3 CMS页面管理需求4 CMS服务端工程搭建注释也是必不可少的KaTeX数学公..._学成在线项目怎么写成简历

使用指针实现字符串拷贝_字符指针拷贝-程序员宅基地

文章浏览阅读488次。【代码】使用指针实现字符串拷贝。_字符指针拷贝

Qt自定义控件9:波浪进度条1_qt 波浪进度球-程序员宅基地

文章浏览阅读502次。Qt自定义控件8:波浪进度条1先看效果图:思路:利用QPaintPath画出封闭路径,填充颜色,圆弧使用正弦函数,根据横坐标递增,画出正弦函数线。关键代码:void WaterProgressBar1::paintEvent(QPaintEvent *event){ int width = this->width(); int height = this->h..._qt 波浪进度球

推荐文章

热门文章

相关标签