(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的应用

猜你喜欢

转载自www.cnblogs.com/Ge-Zsj/p/12741911.html