一、微服务简介
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的应用