zoukankan      html  css  js  c++  java
  • (7)微服务之SpringCloud

    一、微服务简介

    1、微服务是什么

      单体项目:All in one,所有的功能模块都在一起,一个项目搞定所有内容,市场留存率最高;

    随着用户量的增多,迭代需要得加剧,单体跟不上节奏,工作效能越来越低

      微服务:面向服务开发的一种架构思维;就是将一些功能模块,给拆解成一个个独立的小项目(服务);

      这些服务特点:轻、独、松耦合等等

      服务如何拆分:理论上越细越好,实际上考虑成本

      主流的拆分微服务的方式:按照功能拆分,一个功能就是一个服务(会员功能,商品功能,购物车,订单,评价,物流-

      -->会员服务,商品服务,购物车服务,订单服务,评价服务,物流服务)

      

      目主流的解决方案:

      1、Dubbo(曾经的王者 市场占有率还是比较高的 老项目)

      2、SpringCloud(现在的王者 主流  必会)

    2、SpringCloud

      (1)SpringCloud的简介(SpringCloud中文文档:https://www.springcloud.cc/

      (2)SpringCloud的核心子项目

      (3)Spring Cloud Netflix核心组件

    3、SpringCloud项目初体验

      (1)注册中心

        采用eureka

        1、依赖jar

           <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>   

        2、修改开关类

          开关类上使用注解,标记这是注册中心 服务端

    @SpringBootApplication
    @EnableEurekaServer  //标记这是一个注册中心,服务端
    public class ServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ServerApplication.class,args);
        }
    }      

        3、编写配置文件

    server:
      port: 8761
    # 实现注册中心的相关设置
    eureka:
      instance:
        hostname: localhost  #主机的名称
      client:
        register-with-eureka: false #当前项目不进行注册;服务端
        fetch-registry: false   #屏蔽 发现服务
        service-url:
         defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

        4、运行

          浏览器运行:http://localhost:8761/

        

       (2)公共项目

        Cloud_Model  jar  其他项目进行依赖

      (3)提供者

        Cloud_Provider  实现服务的提供

        核心作用:

          1、连接数据库

          2、实现持久层操作

          3、实现业务逻辑层

          4、实现对外的访问接口 -- 控制层

        创建表的SQL语句:

    create table t_sign(
            id int PRIMARY key AUTO_INCREMENT,
            name VARCHAR(20),
            classname VARCHAR(30),
            stime datetime,
            type VARCHAR(30) 
    );

        实现步骤:

          1、依赖jar

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.13</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.1</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.20</version>
            </dependency>

        2、编写持久层

    public interface StudentSignDao {
    
        //签到
        //mybatis如何获取自增组主键的值
        @Insert("insert into t_sign(name,classname,stime,type) values(#{name},#{classname},now(),#{type})")
        @Options(useGeneratedKeys = true,keyProperty = "id")
        int insert(StudentSign studentSign);
        //查询某个人的签到记录
        @Select("select * from t_sign where name=#{name}")
        List<StudentSign> selectByName(String name);
        //查询全部
        @Select("select * from t_sign order by stime desc")
        List<StudentSign> selectAll();
    }

        3、编写业务逻辑层

    public interface StudentSignService {
        R sign(SignDto signDto);
        R queryByName(String name);
        R queryAll();
    }
    @Component
    @Service
    public class StudentSignServiceImpl implements StudentSignService {
        @Autowired
        private StudentSignDao studentSignDao;
    
        @Override
        public R sign(SignDto signDto) {
            StudentSign studentSign = new StudentSign();
            studentSign.setName(signDto.getName());
            studentSign.setClassname(signDto.getClassname());
            studentSign.setType("上课前签到");
            if (studentSignDao.insert(studentSign) > 0) {
                return R.ok();
            } else {
                return R.fail();
            }
        }
    
        @Override
        public R queryByName(String name) {
            List<StudentSign> list = studentSignDao.selectByName(name);
            if (list != null) {
                return R.ok(list);
            } else {
                return R.fail("暂无签到数据");
            }
        }
    
        @Override
        public R queryAll() {
            return R.ok(studentSignDao.selectAll());
        }
    }

        4、编写控制层

    @Controller
    public class StudentSignController {
        @Autowired
        private StudentSignService studentSignService;
    
        @PostMapping("/provider/sign/save.do")
        public R save(@RequestBody SignDto signDto){
            return studentSignService.sign(signDto);
        }
    
        @GetMapping("/provider/sign/queryname.do")
        public R queryname(@RequestParam String name){
            return studentSignService.queryByName(name);
        }
        @GetMapping("/provider/sign/queryall.do")
        public R queryall(){
            return studentSignService.queryAll();
        }
    }    

      敲黑板 1、在SpringCloud开发中,控制成的参数必须使用注解标记,不可省略

             @RequestBody参数为json字符串post请求;

             @RequestParam参数为键值对,用于get请求

        5、修改开关类

    @SpringBootApplication
    @EnableDiscoveryClient  //发现和注册服务
    @MapperScan("com.ge.dao")
    public class ProviderApplication {
        public static void main(String[] args) {
            SpringApplication.run(ProviderApplication.class,args);
        }
    }

        6、修改配置文件

    server:
      port: 8901
    spring:
      application:
        name: xph-provider
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/db_yq?characterEncoding=UTF-8&&serverTimezone=UTC
        username: root
        password: 123456
        type: com.alibaba.druid.pool.DruidDataSource
    #配置注册中心地址
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/

        7、测试运行

      (3)消费者

        实现服务的消费,Cloud_Consumer,SpringBoot项目

        核心作用:

          1、完成服务消费 OpenFeign 或者 Ribbon

          2、配置在线接口

          3、预处理操作,过滤器

        实现步骤:

          1、依赖

       <dependency>
                <groupId>com.ge</groupId>
                <artifactId>Cloud_Model</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.9.2</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.9.2</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>

        2、基于Fegin定义对应的接口

    4、网关Zuul

    5、Zuul的应用

    6、熔断器Hystrix

    7、Hystrix的应用

  • 相关阅读:
    宏定义问题
    (转载)(int)a、&a、(int)&a、(int&)a的区别,很偏僻的题
    boolalpha的作用
    一些小细节
    HTTP Keep-Alive的作用
    数据库三大范式
    laravel 安装语言包
    MySQL存储引擎中的MyISAM和InnoDB区别详解
    推荐一款超好用的工具cmder
    如何保证代码质量
  • 原文地址:https://www.cnblogs.com/Ge-Zsj/p/12741911.html
Copyright © 2011-2022 走看看