
一、微服务简介
1、微服务是什么
单体项目:All in one,所有的功能模块都在一起,一个项目搞定所有内容,市场留存率最高;
随着用户量的增多,迭代需要得加剧,单体跟不上节奏,工作效能越来越低
:面向服务开发的一种架构思维;就是将一些功能模块,给拆解成一个个独立的小项目(服务);
这些服务特点:轻、独、松耦合等等
服务如何拆分:理论上越细越好,实际上考虑成本
主流的拆分微服务的方式:按照功能拆分,一个功能就是一个服务(会员功能,商品功能,购物车,订单,评价,物流-
-->会员服务,商品服务,购物车服务,订单服务,评价服务,物流服务)
目主流的解决方案:
1、Dubbo(曾经的王者 市场占有率还是比较高的 老项目)
2、SpringCloud(现在的王者 主流 必会)
2、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/")
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/")
public R queryall(){
return studentSignService.queryAll();
}
}敲黑板 1、在SpringCloud开发中,控制成的参数必须使用注解标记,不可省略
@RequestBody参数为json字符串post请求;
@RequestParam参数为键值对,用于get请求
5、修改开关类
@SpringBootApplication
@EnableDiscoveryClient //发现和注册服务
@MapperScan(".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></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的应用
















