互联网应用和传统应用
互联网应用
互联网应用(Internet Application)是指基于互联网进行开发和部署的应用程序。它通过互联网提供各种服务和功能,使用户能够通过浏览器、移动应用或其他客户端与应用进行交互。
传统应用
传统应用(Traditional Application)是指在互联网出现之前或互联网技术普及之前开发的应用程序。传统应用通常是基于单个计算机或本地网络环境运行的应用程序,与互联网应用相比,它们具有一些区别和特点。
区别:
-
架构和部署方式:传统应用通常是基于单个服务器或本地计算机上的单体应用程序,而互联网应用则是基于分布式系统架构。互联网应用通常使用云计算平台进行部署,可以水平扩展以应对高并发访问需求。
-
网络通信和连接性:互联网应用通过网络连接实现用户与应用之间的交互,而传统应用通常在本地网络或局域网内运行。互联网应用必须考虑网络延迟、带宽限制和安全性等因素。
-
用户访问方式:互联网应用允许用户通过各种终端设备(如电脑、手机、平板等)通过互联网访问,而传统应用可能限定在特定的设备或网络环境中使用。
-
数据传输和存储:互联网应用通常处理大量的数据传输和存储需求,而传统应用可能更侧重于本地数据处理。互联网应用需要考虑数据安全性、可扩展性和备份恢复等因素。
-
用户规模和并发性:互联网应用通常面对大规模用户群体和高并发访问,需要具备可伸缩性和高性能。传统应用的用户规模和并发性相对较小。
微服务架构和单体应用架构
微服务架构
微服务架构: 微服务架构是一种将应用程序拆分为一组小型、独立的服务的架构模式。每个服务都具有自己的代码库、数据库和资源,并通过网络进行通信。每个服务都负责特定的功能或业务领域。
优点:
- 可扩展性:微服务架构允许根据需要独立地扩展特定的服务,从而实现更好的性能和可伸缩性。
- 独立部署:每个服务可以独立地构建、测试和部署,不会影响其他服务的运行。
- 技术灵活性:每个微服务可以使用适合自身需求的最佳技术和工具。
缺点:
- 系统复杂性:微服务架构需要管理多个服务之间的通信和协调,增加了系统复杂性。
- 运维成本高:管理和监控多个独立的服务可能需要更多的人力和资源。
- 分布式事务:在跨多个服务的操作中实现事务管理可能变得复杂。
单体架构:
单体应用架构: 单体应用架构是一种传统的软件架构模式,应用程序作为一个整体被构建、打包和部署。在单体应用中,所有的功能模块和业务逻辑都在同一个代码库中,并共享相同的数据库和资源。
优点 :
- 简单:单体应用结构相对简单,易于开发、测试和部署。
- 性能:单体应用内部通信延迟较低,性能相对较好。
- 初始开发成本低:开发人员可以集中精力进行单个应用程序的开发。
缺点:
- 可扩展性差:单体应用的扩展性有限,随着用户量的增加,可能需要水平扩展整个应用。
- 维护困难:由于整个应用的代码和逻辑在一个代码库中,修改和维护可能会变得复杂。
- 技术选型限制:由于应用程序的所有部分都耦合在一起,很难选择和采用新的技术或框架。
区别:
一、架构组织方式:
- 微服务架构:应用程序以一组小型、独立的服务组织。每个服务都有自己的代码库、数据库和资源,并通过轻量级通信机制进行交互。
- 单体应用架构:应用程序作为一个整体被组织,所有的模块和功能共享同一个代码库、数据库和资源。
二、可伸缩性:
- 微服务架构:每个服务可以独立地进行水平扩展,只需对需要处理更多负载的服务进行扩展。
- 单体应用架构:整个应用必须进行垂直扩展,即增加整个应用的资源来处理更多负载。
三、开发和部署:
- 微服务架构:每个微服务可以由不同的团队开发和部署,独立进行测试和发布。
- 单体应用架构:整个应用由一个团队开发和部署,需要进行整体的集成测试和部署。
四、系统复杂性:
- 微服务架构:由于涉及多个独立的服务,系统的复杂性较高,需要更多的管理和协调。
- 单体应用架构:应用较为简单,系统复杂性较低。
五、技术灵活性:
- 微服务架构:每个微服务可以选择适合自身需求的技术和工具。
- 单体应用架构:由于整个应用耦合在一起,技术选型受限。
六、维护和修改:
- 微服务架构:对某个服务的修改和维护不会影响其他服务,每个服务可以独立开发和更新。
- 单体应用架构:修改和维护可能会影响整个应用,需要更多的协调和依赖管理。
Spring Cloud是什么?
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
Spring Cloud官网:https://spring.io/projects/spring-cloud/
Spring Cloud有什么作用?
SpringCloud能够解决微服务架构带来的一系列挑战,提供一个工具包来开发分布式系统
功能包含:
-
分布式配置中心 Config、Nacos
-
服务注册和发现 Eureka、Nacos、Zookeeper、Consul
-
路由 Gateway、Zuul
-
服务之间的调用 Feign、Dubbo
-
负载均衡 Ribbon、LoadBalancer
-
熔断器 Hystrix、Sentinel
-
全局锁
-
集群状态管理
-
分布式消息 Bus
Spring Could的版本介绍
SpringCloud中一些组件是Netflix(网飞)公司开源的,其中有:Eureka、Ribbon、Hystrix、Zuul、Config
SpringCloud和SpringBoot版本对应
微服务入门案例
1.编写商品服务,完成按商品id查询商品的功能
@Autowired
private SysProductService sysProductService;
@GetMapping("product/{id}")
public sysProduct getProductById(@PathVariable Long id){
sysProduct product = sysProductService.getById(id);
return product;
}
2.编写订单服务,完成按订单id查询订单的功能
@Autowired
private SysOrderService sysOrderService;
@GetMapping("order/{id}")
public ResponseResult<sysOrder> getOrderById(@PathVariable Long id){
sysOrder order = sysOrderService.getOrderById(id);
return ResponseResult.ok(order);
}
3. 订单微服务调用商品微服务
@Configuration
public class RestTemplateConfig {
/**
* 创建RestTemplate交给容器
* @return
*/
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
4.订单包含商品信息
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_order")
public class sysOrder implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private Integer productId;
private Integer count;
private Integer userId;
private LocalDateTime time;
@TableField(exist = false)
private sysProduct product;
}
5.订单service查询订单时远程调用商品服务
@Autowired
private SysOrderMapper sysOrderMapper;
//注入客户端
@Autowired
private RestTemplate restTemplate;
@Override
public sysOrder getOrderById(Long id) {
sysOrder sysOrder= sysOrderMapper.selectById(id);
//通过网络连接商品服务调用查询商品的接口
sysProduct result = restTemplate.getForObject(
"http://localhost:8001/product/" + sysOrder.getProductId(), sysProduct.class);
sysOrder.setProduct(result);
return sysOrder;
}
Eureka注册中心的使用
服务注册和发现机制
1) 服务提供者将自己的IP和端口注册到注册中心上
2) 服务提供者每隔一段时间向注册中心发送心跳包
3) 服务消费者调用提供者之前,先向注册中心查询提供者的IP和端口
4) 获得服务清单中的IP和端口后,消费者调用提供者
5) 服务提供者的IP和端口改变后,通过心跳机制更新注册中心上的服务清单
修改父项目POM
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.blb</groupId>
<artifactId>springcloud_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud_demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>8</java.version>
<spring.cloud-version>Hoxton.SR8</spring.cloud-version>
</properties>
<!--固定SpringCloud依赖版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
创建Eureka服务器项目
1.继承父项目POM
<parent>
<groupId>com.blb</groupId>
<artifactId>springcloud_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
2.引入服务器依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3.配置文件
server.port=8000
# 服务器域名
eureka.instance.hostname=127.0.0.1
# 设置不拉取服务清单
eureka.client.fetch-registry=false
# 设置不注册当前服务
eureka.client.register-with-eureka=false
# 定义注册服务的地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
4.启动类加 @EnableEurekaServer
配置Eureka客户端
1.继承父项目pom
2.引入客户端依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.配置文件
# 服务名称
spring.application.name=xxxx
# 设置拉取服务清单
eureka.client.fetch-registry=true
# 设置注册当前服务
eureka.client.register-with-eureka=true
# 定义注册服务的地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8000/eureka
4.启动类加 @EnableEurekaClient或 @EnableDiscoveryClient
5.在RestTemplate配置类方法上加@LoadBalanced
6.调用服务时修改
//调用商品微服务获得商品信息 将IP和端口写死 服务提供者ip和端口发生变化,调用出错
//改用Eureka后,调用时使用服务注册名称调用
ResponseEntity<Product> entity = restTemplate.getForEntity("http://product-service/product/" + order.getProductId(),
Product.class);