目录
一.微服务
1.1单体架构
单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。
优点:架构简单、部署成本低
缺点:耦合度高
1.2分布式架构
分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。
优点:降低服务耦合、有利于服务升级拓展
分布式架构的要考虑的问题:
服务拆分粒度如何?
服务集群地址如何维护?
服务之间如何实现远程调用?
服务健康状态如何感知?
1.3微服务
微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征:
单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
面向服务:微服务对外暴露业务接口
自治:团队独立、技术独立、数据独立、部署独立
隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
1.4各自特点总结
单体架构特点?
简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统
分布式架构特点?
松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝
微服务:一种良好的分布式架构方案
优点:拆分粒度更小、服务更独立、耦合度更低
缺点:架构非常复杂,运维、监控、部署难度提高
1.5微服务技术对比
dubbo | springcloud | springcloudalibaba | |
注册中心 | zookeeper、redis | eureka、consul | nacos、eureka |
服务远程调用 | dubbo协议 | feign(http协议) | dubbo、feign |
配置中心 | 无 | springcloudconfig | springcloudconfig、nacos |
服务网关 | 无 | springcloudgateway、zuul | springcloudgateway、zuul |
服务监控和保护 | dubbo-admin | hystix | sentinel |
二.服务拆分及远程调用
注意事项:
单一职责:不同微服务,不要重复开发相同业务
数据独立:不要访问其它微服务的数据库
面向服务:将自己的业务暴露为接口,供其它微服务调用
首先将顶部的demo代码和sql导入
注意修改yml中的数据库连接用户、密码、数据库以及数据库版本等
运行userservice以及orderservice,在浏览器进行访问,查看是否正常
业务需求:根据订单id查询订单的同时,把订单所属的用户信息一起返回
①首先我们要进行服务的远程调用,先用resttemplate
②首先用@bean管理一个resttemplate,我这里直接在启动类里写了
@mapperscan("cn.itcast.order.mapper")
@springbootapplication
public class orderapplication {
public static void main(string[] args) {
springapplication.run(orderapplication.class, args);
}
@bean
public resttemplate resttemplate(){
return new resttemplate();
}
}
③然后进入controller,进入对应的service方法
@service
public class orderservice {
@autowired
private ordermapper ordermapper;
@autowired
private resttemplate resttemplate;
public order queryorderbyid(long orderid) {
// 1.查询订单
order order = ordermapper.findbyid(orderid);
//2.利用resttemplate进行远程调用
string url = "http://localhost8081/user/"+order.getuserid();
user user = resttemplate.getforobject(url, user.class);
//3.封装user到order里
order.setuser(user);
// 4.返回
return order;
}
}
④重启orderservice服务,访问http://localhost:8080/order/101看是否正常
服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
三.eureka注册中心
3.1服务调用出现的问题
服务消费者该如何获取服务提供者的地址信息?
如果有多个服务提供者,消费者该如何选择?
消费者如何得知服务提供者的健康状态?
3.2eureka作用
消费者该如何获取服务提供者具体信息?
服务提供者启动时向eureka注册自己的信息,eureka保存这些信息,消费者根据服务名称向eureka拉取提供者信息。
如果有多个服务提供者,消费者该如何选择?
服务消费者利用负载均衡算法,从服务列表中挑选一个
消费者如何感知服务提供者健康状态?
服务提供者会每隔30秒向eurekaserver发送心跳请求,报告健康状态
eureka会更新记录服务列表信息,心跳不正常会被剔除
消费者就可以拉取到最新的信息
3.3实践
①搭建注册中心、服务注册
搭建eurekaserver
1.创建一个新模块,命名为eruka-server(随便),改pom导入依赖
<?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">
<parent>
<artifactid>cloud-demo</artifactid>
<groupid>cn.itcast.demo</groupid>
<version>1.0</version>
</parent>
<modelversion>4.0.0</modelversion>
<artifactid>eureka-server</artifactid>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--eureka服务端-->
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-netflix-eureka-server</artifactid>
</dependency>
</dependencies>
</project>
2.编写启动类
@enableeurekaserver
@springbootapplication
public class eurekaapplication {
public static void main(string[] args) {
springapplication.run(eurekaapplication.class,args);
}
}
3.修改application.yml
server:
port: 10086
spring:
application:
name: eurekaserver #eureka服务名称
eureka:
client:
service-url: #eureka地址信息
defaultzone: http://localhost:10086/eureka
②服务发现
将user-service、order-service都注册到eureka
1.在order-service、user-service模块下添加依赖
<!--eureka客户端-->
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
</dependency>
2.修改application.yml,添加以下内容
spring:
application:
name: orderservice #order下写这个 user下写userservice
eureka:
client:
service-url: #eureka地址信息
defaultzone: http://localhost:10086/eureka
3.重启userservice、orderservice
在order-service中完成服务拉取,然后通过负载均衡挑选一个服务,实现远程调用
1.修改orderservice的代码,修改访问的url路径,用服务名代替ip、端口:
2.在order-service项目的启动类orderapplication中的resttemplate添加负载均衡注解,默认轮询:
@bean
@loadbalanced
public resttemplate resttemplate(){
return new resttemplate();
}
3.重启order-service
4.访问http://localhost:8080/order/101
③总结
搭建eurekaserver
引入eureka-server依赖
添加@enableeurekaserver注解
在application.yml中配置eureka地址
服务注册
引入eureka-client依赖
在application.yml中配置eureka地址
服务发现
引入eureka-client依赖
在application.yml中配置eureka地址
给resttemplate添加@loadbalanced注解
用服务提供者的服务名称远程调用
四.ribbon
4.1负载均衡流程
4.2负载均衡规则
ribbon的负载均衡规则是一个叫做irule的接口来定义的,每一个子接口都是一种规则:
通过定义irule实现可以修改负载均衡规则,有两种方式:
1.代码方式:在order-service中的orderapplication类中,定义一个新的irule:
@bean
public irule randomrule(){
return new randomrule();
}
2.配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:
userservice:
ribbon:
nfloadbalancerruleclassname: com.netflix.loadbalancer.randomrule# 负载均衡规则
4.3饥饿加载
ribbon默认是采用懒加载,即第一次访问时才会去创建loadbalanceclient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients:
- userservice #指定对这个服务进行饥饿加载
发表评论