首页 > 其他分享 >9.4. 分布式与微服务架构

9.4. 分布式与微服务架构

时间:2023-06-06 15:58:13浏览次数:43  
标签:服务 Spring id 分布式系统 9.4 架构 public Cloud 分布式

在本章节中,我们将介绍分布式系统和微服务架构的基本概念。分布式系统解决了单体应用面临的可扩展性、高可用性等问题,而微服务架构进一步提升了系统的可维护性和灵活性。

9.4.1. 分布式系统基本概念

分布式系统是由多个独立的计算节点组成的系统,这些节点通过网络进行通信和协作。 分布式系统的主要特点是可扩展性、高可用性和容错性。

  1. 可扩展性(Scalability):分布式系统可以通过添加更多的计算节点来提升处理能力,以应对不断增长的业务需求。
  2. 高可用性(High availability):分布式系统可以在某个节点发生故障时,自动将任务转移到其他正常节点上,从而保证系统的正常运行。
  3. 容错性(Fault tolerance):分布式系统可以在部分节点发生故障时,依然能够正常提供服务。

9.4.2. 微服务架构基本概念

微服务架构是一种软件架构风格,它将一个大型应用划分为多个独立的、可独立部署的小型服务。这些小型服务可以使用不同的编程语言和技术栈进行开发,它们通过轻量级的通信协议(如HTTP/REST)进行互相调用。

微服务架构的主要优势在于:

  1. 可维护性(Maintainability):将一个复杂的大型应用划分为多个小型服务,可以降低每个服务的复杂度,提高代码的可读性和可维护性。
  2. 灵活性(Flexibility):微服务可以独立进行更新和部署,这意味着我们可以更快地响应业务需求的变化,以及尝试新的技术和架构。
  3. 可扩展性(Scalability):我们可以根据每个微服务的需求,独立地进行横向扩展,从而提高整个系统的处理能力。

9.4.3. Spring Cloud

Spring Cloud是一个基于Spring Boot的开发工具集,它提供了一系列用于构建分布式系统和微服务架构的解决方案。在本节中,我们将简要介绍Spring Cloud的主要组件。

  1. Spring Cloud Config:提供了一个集中式配置管理服务,可以让所有的微服务从一个中心位置获取配置信息。
  2. Spring Cloud Eureka:提供了一个服务注册与发现的解决方案。微服务可以向Eureka注册,然后通过Eureka获取其他微服务的实例信息。
  3. Spring Cloud Ribbon:提供了客户端负载均衡的功能。通过Ribbon,我们可以将请求自动分发到多个服务实例,从而提高系统的可用性和容错性。
  4. Spring Cloud Feign:提供了一个声明式的HTTP客户端。通过Feign,我们可以更加简洁地编写服务间的调用代码。
  5. Spring Cloud Hystrix:提供了熔断器和线程隔离的功能。当某个服务出现故障时,Hystrix可以自动降级服务,从而保证整个系统的稳定性。
  6. Spring Cloud Zuul:提供了一个API网关服务。通过Zuul,我们可以实现请求路由、负载均衡、认证授权等功能。

9.4.4. 示例:创建一个简单的微服务应用

在这个示例中,我们将使用Spring Boot和Spring Cloud创建一个简单的微服务应用。该应用包含两个服务:一个是用户服务,另一个是订单服务。用户服务负责管理用户信息,订单服务负责管理订单信息。订单服务需要调用用户服务来获取用户信息。

1. 创建Eureka服务注册中心

首先,我们需要创建一个Eureka服务注册中心。使用Spring Boot创建一个新项目,并添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

application.yml文件中,配置Eureka服务:

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

在启动类上添加@EnableEurekaServer注解:

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

2. 创建用户服务

创建一个新的Spring Boot项目,并添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

application.yml文件中,配置服务名和Eureka服务地址:

spring:
  application:
    name: user-service

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

创建一个简单的用户实体类和控制器:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    // 省略getter和setter方法
}

@RestController
@RequestMapping("/users")
public class UserController {
    // 这里仅用一个Map模拟数据库
    private final Map<Long, User> userMap = new ConcurrentHashMap<>();

    @PostMapping
    public User createUser(@RequestBody User user) {
        user.setId(userMap.size() + 1L);
        userMap.put(user.getId(), user);
        return user;
    }

    @GetMapping("/{id}")
    public User getUser(@PathVariable("id") Long id) {
        return userMap.get(id);
    }
}

在启动类上添加@EnableDiscoveryClient注解:

@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

3. 创建订单服务

创建一个新的Spring Boot项目,并添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

application.yml文件中,配置服务名和Eureka服务地址:

spring:
  application:
    name: order-service

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

创建一个简单的订单实体类和控制器:

@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private Long userId;
    // 省略getter和setter方法
}

@RestController
@RequestMapping("/orders")
public class OrderController {
    // 这里仅用一个Map模拟数据库
    private final Map<Long, Order> orderMap = new ConcurrentHashMap<>();

    @Autowired
    private UserServiceClient userServiceClient;

    @PostMapping
    public Order createOrder(@RequestBody Order order) {
        order.setId(orderMap.size() + 1L);
        orderMap.put(order.getId(), order);
        return order;
    }

    @GetMapping("/{id}")
    public Order getOrder(@PathVariable("id") Long id) {
        Order order = orderMap.get(id);
        User user = userServiceClient.getUser(order.getUserId());
        order.setUser(user);
        return order;
    }
}

创建一个Feign客户端来调用用户服务:

@FeignClient("user-service")
public interface UserServiceClient {
    @GetMapping("/users/{id}")
    User getUser(@PathVariable("id") Long id);
}

在启动类上添加@EnableDiscoveryClient@EnableFeignClients注解:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

至此,我们已经创建了一个简单的微服务应用。用户服务和订单服务都向Eureka服务注册中心注册了自己,订单服务可以通过Feign客户端调用用户服务获取用户信息。

9.4.5. 示例总结

在本示例中,我们使用了Spring Cloud的主要组件来构建一个简单的微服务应用。Eureka服务注册中心负责管理服务实例信息,Feign客户端简化了服务间调用的代码。微服务架构使得我们可以独立地开发、部署和扩展每个服务。

这个示例仅仅涉及到了微服务架构的一些基本概念。在实际项目中,我们还需要考虑其他诸如数据一致性、服务降级、API网关等问题。通过不断学习和实践,你会对分布式系统和微服务架构有更加深入的理解。
推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

file

标签:服务,Spring,id,分布式系统,9.4,架构,public,Cloud,分布式
From: https://www.cnblogs.com/yaoqian/p/17460769.html

相关文章

  • 应用问题解决-分布式锁(LUA保证删除原子性)
    问题:删除操作缺乏原子性场景1、index1获得锁、执行具体操作、比较lock的uuid值确实和自己生成的uuid是否相等,相等则删除锁。uuid=v1set(lock,uuid)uuid.equals(get("lock"))2、但是index1执行删除前,lock刚好过期时间已经到了,被redis自动释放3、此时index2获取锁,执行具体......
  • 分布式搜索elasticsearch集群监控工具bigdesk
    bigdesk是elasticsearch的一个集群监控工具,可以通过它来查看es集群的各种状态,如:cpu、内存使用情况,索引数据、搜索情况,http连接数等。项目git地址: https://github.com/lukas-vlcek/bigdesk。和head一样,它也是个独立的网页程序,使用方式和head一样。插件安装运行......
  • 苍穹外卖【技术架构】
    用户层Node.jsVue.jsElementUI微信小程序ApacheECharts工具网关层NginxGit应用层SpringBootSpringMVCSpringTaskHttpClientSpringCacheMavenJWT阿里云OSSSwaggerPOIWebSocketJUnit数据层MySQLRedisMyBatisPageHelperSpringDataRed......
  • 分布式事务的解决方案及中间件
    方案一:XA两阶段提交方案是一种比较重的操作,其中有有以下三个角色:事务管理器(TM)、事务协调者(TC)、资源管理器(RM),资源锁定时间长,效率低。方案二:TCC采用冻结预留的方式锁定资源,开发量较大,常用于资金交易类的场景。方案三:本地消息表严重依赖消息表来管理事务,并不适用高......
  • ARM架构---Python环境部署
    ARM架构---Python环境部署编译方式百度下即可,在ARM服务器编译出来就可以用1、上传python37.tar.gz文件到服务器py环境是在ARM架构上编译好的,可以直接拿编译产物去运行#例如上传到/data/software/目录cd/data/software/#解压tar-xfpython37.tar.gz#做软链接......
  • 分布式锁(设置锁和过期时间)
    问题描述:随着业务发展的需要,原单体单机部署的系统被演化分成分布式集群系统后,由于分布式系统多线程、多进程且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的JavaAPI并不能提供分布式锁的能力。为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的......
  • Dubbo微服务架构
    1、什么是微服务?微服务就是一种软件开发架构风格,将应用程序拆分成小的、独立的服务单元,每个服务单元都可以独立部署和扩展,并通过轻量级的通信机制相互协作。2、什么是Dubbo?Dubbo是一款高性能的微服务框架,它提供了多种开箱即用的功能,例如服务发现、负载均衡、远程调用等。3、......
  • 前后端分离架构下使用 Sa-Token 完成登录认证
    一、架构分析目前绝大多数系统都已经采用“前后端分离”架构来设计了,传统的Session模式鉴权也不再适合这种架构(或者需要额外写很多的代码来专门适配)。Sa-Token是一个java轻量级权限认证框架,专为前后端分离架构打造,主要解决登录认证、权限认证、单点登录、OAuth2、微服务网......
  • Kubernetes架构:构建容器化应用的可扩展管理平台
    摘要:Kubernetes是一款用于容器编排和管理的开源工具,其架构设计具有高度可扩展性和弹性。本文将介绍Kubernetes的架构,包括Master节点和Worker节点的角色和功能,以及它们之间的交互方式,帮助读者更好地理解Kubernetes的工作原理。引言:在当今的云原生应用开发环境中,容器化技术的普及......
  • 【低代码】可视化低代码产品实现基本架构
    低代码在做什么第一性原理意味着你抛弃一切,直击真相本质,然后从那里开始推理。1通过第一性原理思维方式去思考低代码,首先不管我们做什么方式进行编程,一定是为了获得一个满足我们需求的程序,低代码和传统方式的区别在于进一步降低了编程门槛,将编程变成了一种更直观更容易理解方式,并未......