Spring Cloud入门

互联网应用和传统应用

互联网应用

        互联网应用(Internet Application)是指基于互联网进行开发和部署的应用程序。它通过互联网提供各种服务和功能,使用户能够通过浏览器、移动应用或其他客户端与应用进行交互。

传统应用 

        传统应用(Traditional Application)是指在互联网出现之前或互联网技术普及之前开发的应用程序。传统应用通常是基于单个计算机或本地网络环境运行的应用程序,与互联网应用相比,它们具有一些区别和特点。

区别:

  1. 架构和部署方式:传统应用通常是基于单个服务器或本地计算机上的单体应用程序,而互联网应用则是基于分布式系统架构。互联网应用通常使用云计算平台进行部署,可以水平扩展以应对高并发访问需求。

  2. 网络通信和连接性:互联网应用通过网络连接实现用户与应用之间的交互,而传统应用通常在本地网络或局域网内运行。互联网应用必须考虑网络延迟、带宽限制和安全性等因素。

  3. 用户访问方式:互联网应用允许用户通过各种终端设备(如电脑、手机、平板等)通过互联网访问,而传统应用可能限定在特定的设备或网络环境中使用。

  4. 数据传输和存储:互联网应用通常处理大量的数据传输和存储需求,而传统应用可能更侧重于本地数据处理。互联网应用需要考虑数据安全性、可扩展性和备份恢复等因素。

  5. 用户规模和并发性:互联网应用通常面对大规模用户群体和高并发访问,需要具备可伸缩性和高性能。传统应用的用户规模和并发性相对较小。

 微服务架构和单体应用架构

微服务架构

        微服务架构: 微服务架构是一种将应用程序拆分为一组小型、独立的服务的架构模式。每个服务都具有自己的代码库、数据库和资源,并通过网络进行通信。每个服务都负责特定的功能或业务领域。

优点:

  • 可扩展性:微服务架构允许根据需要独立地扩展特定的服务,从而实现更好的性能和可伸缩性。
  • 独立部署:每个服务可以独立地构建、测试和部署,不会影响其他服务的运行。
  • 技术灵活性:每个微服务可以使用适合自身需求的最佳技术和工具。

缺点:

  • 系统复杂性:微服务架构需要管理多个服务之间的通信和协调,增加了系统复杂性。
  • 运维成本高:管理和监控多个独立的服务可能需要更多的人力和资源。
  • 分布式事务:在跨多个服务的操作中实现事务管理可能变得复杂。

 

单体架构:

        单体应用架构: 单体应用架构是一种传统的软件架构模式,应用程序作为一个整体被构建、打包和部署。在单体应用中,所有的功能模块和业务逻辑都在同一个代码库中,并共享相同的数据库和资源。

优点 :

  • 简单:单体应用结构相对简单,易于开发、测试和部署。
  • 性能:单体应用内部通信延迟较低,性能相对较好。
  • 初始开发成本低:开发人员可以集中精力进行单个应用程序的开发。

缺点:

  • 可扩展性差:单体应用的扩展性有限,随着用户量的增加,可能需要水平扩展整个应用。
  • 维护困难:由于整个应用的代码和逻辑在一个代码库中,修改和维护可能会变得复杂。
  • 技术选型限制:由于应用程序的所有部分都耦合在一起,很难选择和采用新的技术或框架。

区别:

一、架构组织方式:

  • 微服务架构:应用程序以一组小型、独立的服务组织。每个服务都有自己的代码库、数据库和资源,并通过轻量级通信机制进行交互。
  • 单体应用架构:应用程序作为一个整体被组织,所有的模块和功能共享同一个代码库、数据库和资源。

二、可伸缩性:

  • 微服务架构:每个服务可以独立地进行水平扩展,只需对需要处理更多负载的服务进行扩展。
  • 单体应用架构:整个应用必须进行垂直扩展,即增加整个应用的资源来处理更多负载。

三、开发和部署:

  • 微服务架构:每个微服务可以由不同的团队开发和部署,独立进行测试和发布。
  • 单体应用架构:整个应用由一个团队开发和部署,需要进行整体的集成测试和部署。

四、系统复杂性:

  • 微服务架构:由于涉及多个独立的服务,系统的复杂性较高,需要更多的管理和协调。
  • 单体应用架构:应用较为简单,系统复杂性较低。

五、技术灵活性:

  • 微服务架构:每个微服务可以选择适合自身需求的技术和工具。
  • 单体应用架构:由于整个应用耦合在一起,技术选型受限。

六、维护和修改:

  • 微服务架构:对某个服务的修改和维护不会影响其他服务,每个服务可以独立开发和更新。
  • 单体应用架构:修改和维护可能会影响整个应用,需要更多的协调和依赖管理。

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值