1.springcloud简介
spring cloud是一个用于构建分布式系统的开源框架。它为开发人员提供了一套丰富的工具和库,用于快速构建云原生应用程序以及实现微服务架构。
spring cloud基于spring framework,通过各种可插拔的模块和组件,提供了配置管理、服务发现、服务网关、负载均衡、断路器、消息总线等功能,使得构建和管理大规模分布式系统变得更加容易。
优点:
-
简化分布式系统开发:spring cloud提供了一套完整的工具和组件,能够快速构建和管理分布式系统。它提供了集成式的解决方案,使开发人员能够专注于业务逻辑,而不必关注底层的分布式系统架构和复杂性。
-
微服务支持:spring cloud为微服务架构提供了丰富的支持,包括服务注册与发现、负载均衡、断路器、配置管理等。它提供了一种轻量级且灵活的方式来构建和管理微服务,在实现业务需求的同时提供了高可用性、弹性和可扩展性。
-
可插拔组件:spring cloud的各个组件都是可插拔的,可以根据需求进行选择和集成。它与spring生态系统紧密结合,充分利用了spring的核心功能和特性,如依赖注入、面向切面编程等。
-
社区活跃:spring cloud拥有一个活跃的社区,提供了大量的文档、教程和示例代码。开发人员可以从社区获取支持和解决方案,也可以积极参与社区的讨论和贡献,推动框架的发展和改进。
缺点:
-
配置复杂:由于分布式系统的复杂性,使用spring cloud构建和管理分布式系统时,配置可能会变得复杂。需要仔细设计和管理各个组件之间的依赖关系和配置项,以确保系统的正常运行。
-
学习曲线较陡:spring cloud是一个庞大而复杂的框架,对于初学者来说,学习曲线可能较陡峭。需要掌握spring的核心概念和基础知识,并熟悉spring boot和各个spring cloud组件的使用方法。
-
运维压力:构建和运维分布式系统需要更多的工作和资源,包括服务部署、容器编排、监控和调试等。这可能增加了运维的复杂性和成本。
2.微服务架构
微服务架构和单体应用架构是两种不同的软件架构模式,它们有以下区别:
-
架构复杂性:在单体应用架构中,所有的功能和模块都集中在一个单一的应用程序中,而在微服务架构中,应用程序被拆分成多个小而自治的服务。微服务架构的复杂性更高,因为需要设计和管理多个独立的服务,并确保它们之间的协作和通信。
-
可伸缩性:微服务架构可以更容易地实现水平扩展,因为每个微服务可以独立部署和扩展。而在单体应用架构中,整个应用程序需要作为一个整体进行扩展,可能会面临一些限制。
-
独立部署和灵活性:微服务架构允许每个服务独立部署,并使用适合其需求的技术栈和语言。这为团队带来了更大的灵活性和自主权。而在单体应用架构中,整个应用程序需要作为一个整体进行部署和升级。
-
可维护性:微服务架构在某种程度上提高了可维护性。由于每个微服务都是相对较小的,易于理解和维护,更容易进行快速修复和功能更新。然而,在单体应用架构中,较大和复杂的应用程序可能更难以维护。
-
团队组织和协作:微服务架构通常可以更容易地实现团队的分工和独立开发。不同的团队可以独立负责不同的微服务,并与其他团队合作。这样可以提高开发效率和灵活性。单体应用架构下的开发可能要求更紧密的协作和代码管理。
-
服务间通信和网络延迟:在微服务架构中,服务之间的通信通过网络进行,可能会引入一定的网络延迟。而在单体应用架构中,模块间的通信是通过函数调用等方式完成的,通常不会受到网络延迟的影响。
综上所述,微服务架构和单体应用架构在架构复杂性、可伸缩性、独立部署、灵活性、可维护性以及团队组织和协作等方面存在显著的区别。选择哪种架构取决于具体的需求、项目规模和团队组织等因素。
3.微服务演示
由上图可知:微服务是n个项目打成n个包部署到n台服务器
将传统单体应用架构拆分为多微服务项目,每个微服务可以相互通信,部署到各自的服务器
package com.blb.common.entity;
import com.baomidou.mybatisplus.annotation.tablefield;
import lombok.allargsconstructor;
import lombok.data;
import lombok.noargsconstructor;
import java.util.date;
@data
@allargsconstructor
@noargsconstructor
public class sysorder {
private long id;
private long productid;
private long count;
private long userid;
private date time;
@tablefield(exist = false)
private sysproduct product;
}
这是一个订单实体类,里面包含有订单。
@getmapping("product/{id}")
public sysproduct getbyorderid(@pathvariable string id){
sysproduct byorderid = orderservice.getbyorderid(long.valueof(id));
return byorderid;
}
在product微服务中定义的接口
server.port=8001
在product配置文件中定义端口为8001
package com.blb.order.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.serviceimpl;
import com.blb.common.entity.sysorder;
import com.blb.common.entity.sysproduct;
import com.blb.order.mapper.ordermapper;
import com.blb.order.service.orderservice;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.service;
import org.springframework.web.client.resttemplate;
@service
public class orderserviceimpl extends serviceimpl<ordermapper, sysorder> implements orderservice {
@autowired
private ordermapper ordermapper;
@autowired
private resttemplate resttemplate;
@override
public sysorder getbyorderid(long id) {
sysorder sysorder = ordermapper.selectbyid(id);
sysproduct template = resttemplate.getforobject("http://localhost:8001/product/"+sysorder.getid(), sysproduct.class);
sysorder.setproduct(template);
return sysorder;
}
}
在order微服务模组中调用product的接口,实现模组调用模组;以上就是简单的微服务案例;
4.什么是服务治理
spring cloud 封装了 netflix
公司开发的 eureka 模块来实现服务治理
服务治理就是提供了微服务架构中各微服务实例的快速上线或下线且保持各服务能正常通信的能力的方案总称。
什么是eureka:
eureka是netflix开源的一个服务注册和发现组件,用于构建和管理分布式系统中的微服务架构。
eureka 的核心功能是服务注册和发现。在微服务架构中,每个服务都需要将自己注册到 eureka 服务器,以便其他服务可以发现和调用它。eureka 服务器充当服务注册中心,维护着所有可用的服务实例的信息,包括它们的网络地址、健康状态等。这使得服务实例可以动态地加入或退出系统,同时也支持服务实例的负载均衡和故障转移。
以下是 eureka 的一些关键特性:
-
服务注册和发现:eureka 提供了简单易用的 api,使服务实例能够方便地自我注册到 eureka 服务器,并能够查询其他服务实例的信息。服务实例定期向 eureka 服务器发送心跳来表明自己的健康状态。
-
高可用性:eureka 支持多个 eureka 服务器实例的高可用部署,每个实例之间相互注册并相互跟踪。当一个 eureka 服务器不可用时,其他实例可以继续提供服务注册和发现功能,保证系统的可用性。
-
负载均衡:eureka 客户端中集成了负载均衡的功能,能够根据一定的策略从多个可用的服务实例中选择一个来处理请求,从而实现请求的分发和调度。
-
自我保护机制:eureka 支持自我保护机制,当检测到与 eureka 服务器的连接故障时,服务实例仍可以通过本地缓存继续提供服务注册和发现功能,避免由于过度保护导致系统的不可用。
eureka提供两大组件:
eureka server提供注册服务功能
相关依赖
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-netflix-eureka-server</artifactid>
</dependency>
eurekaclient通过注册中心进行访问
相关依赖
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
</dependency>
什么时候使用eureka
准确来说是什么场景需要使用注册中心:
搭建eureka服务项目
由上述案例继续搭建一个eureka-server模组,将依赖导入
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-netflix-eureka-server</artifactid>
</dependency>
修改配置文件
spring.application.name=eureka-server
server.port=8888
# 注册中心的地址
eureka.instance.hostname=127.0.0.1
# 是否拉取服务清单
eureka.client.fetch-registry=true
# 是否注册到eureka
eureka.client.register-with-eureka=true
# 定义注册中的服务地址
eureka.client.serviceurl.defaultzone=http://127.0.0.1:8822/eureka,http://127.0.0.1:8833/eureka
启动类添加@enableeurekaserver注解
@enableeurekaserver
@springbootapplication
public class eurekaserverapplication {
public static void main(string[] args) {
springapplication.run(eurekaserverapplication.class, args);
}
}
修改上面order、product的pom文件,加上依赖
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
</dependency>
修改配置文件:
order
#加上以下代码:
spring.application.name=order-service
#配置eureka客户端是否注册到eureka
eureka.client.register-with-eureka=true
#拉取服务清单
eureka.client.fetch-registry=true
# 注册中心地址
eureka.client.serviceurl.defaultzone=http://127.0.0.1:8888/eureka
product
spring.application.name=product-service
#配置eureka客户端是否注册到eureka
eureka.client.register-with-eureka=true
#拉取服务清单
eureka.client.fetch-registry=true
# 注册中心地址
eureka.client.serviceurl.defaultzone=http://127.0.0.1:8888/eureka
在order、product的启动类上添加@enableeurekaclient注解
修改order的service实现类
@service
public class orderserviceimpl extends serviceimpl<ordermapper, sysorder> implements orderservice {
@autowired
private ordermapper ordermapper;
@autowired
private resttemplate resttemplate;
@override
public sysorder getbyorderid(long id) {
sysorder sysorder = ordermapper.selectbyid(id);
sysproduct template = resttemplate.getforobject("http://product-service/product/"+sysorder.getid(), sysproduct.class);
sysorder.setproduct(template);
return sysorder;
}
}
然后启动服务器eureka-server和两个客户端order、product
输入地址localhost:8888
发表评论