分布式微服务

13 篇文章 0 订阅

目录

认识微服务

单体服务架构的特点

分布式架构的特点

微服务

SpringCloud

总结

服务拆分及远程调用

服务拆分原则

假如在订单服务中,需要一起返回用户的信息

Eureka注册中心

Eureka的结构和作用

问题:order-service如何得知user-service实例地址?

问题:order-service如何从多个user-service实例中选择具体的实例?

问题:order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

搭建eureka-server

1.创建eureka-server服务

2.引入eureka依赖

3.编写启动类

4.编写配置文件

5.启动服务

 服务注册

1.引入依赖

2.配置文件

3.启动user服务

服务发现

1.引入依赖

2.配置文件

3.服务拉取,负载均衡


认识微服务

单体服务架构的特点

  1. 复杂程度高。维护成本越来越高,各个模块之间边界模糊,一个模块的改动可能导致整个服务出现问题,一点内存泄漏、一处指针错误就会让整个服务停机。
  2. 水平扩展困难。单机的容量有限,而且缺乏弹性,一荣俱荣,一损俱损。垂直扩展受到硬件约束,水平扩展也比较困难。
  3. 性能优化困难。单体服务支持着多个业务,多种逻辑可以交织在一起,互相影响,互相争用系统资源,在服务性能调优时很难取舍,要做出令人满意的平衡很难。
  4. 可测试性变差。复杂性变高、模块众多、耦合在一起的代码必然造成测试困难。

分布式架构的特点

  1. 耦合度降低
  2. 可重用性高
  3. 开发效率高

微服务

微服务是一种经过良好架构设计的分布式架构方案。

微服务的架构特征:

优点:服务拆分粒度更小,服务更独立,耦合度更低

缺点:架构非常复杂,运维,监控,部署难度更高。

SpringCloud

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验

总结

服务拆分及远程调用

服务拆分原则

1、单一职责:不同微服务,不要重复开发相同业务。

2、数据独立:不要访问其他微服务的数据库

3、面向服务:将自己的业务暴露为接口,供其他微服务调用

假如在订单服务中,需要一起返回用户的信息

 

我们的做法:

第一步:注册RestTemplate

首先,我们在订单服务中的启动类中,注册RestTemplate实例:

package com.tledu.order;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.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();
    }
}

第二步:远程调用

修改订单服务中的OrderService类中的queryOrderById方法:

 

Eureka注册中心

假如我们的服务提供者user-service部署了多个实例,如图:

 

Eureka的结构和作用

 

问题:order-service如何得知user-service实例地址?

获取地址信息的流程如下:

问题:order-service如何从多个user-service实例中选择具体的实例?

问题:order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

注意:一个微服务,既可以是服务提供者,又可以是服务消费者,因此eureka将服务注册、服务发现等功能统一封装到了eureka-client端

 

搭建eureka-server

1.创建eureka-server服务

父工程下创建子工程 

2.引入eureka依赖

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

3.编写启动类

给eureka-server服务编写一个启动类,一定要添加一个@EnableEurekaServer注解,开启eureka的注册中心功能:

package com.tledu.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

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

4.编写配置文件

server:
  port: 10086
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url: 
      defaultZone: http://127.0.0.1:10086/eureka

5.启动服务

启动微服务,然后在浏览器访问:http://127.0.0.1:10086

 服务注册

下面,我们将user-service注册到eureka-server中去

1.引入依赖

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

2.配置文件

spring:
  application:
    name: userservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

3.启动user服务

 

 

 

 

服务发现

1.引入依赖

之前说过,服务发现、服务注册统一都封装在eureka-client依赖,因此这一步与服务注册时一致。

在order-service的pom文件中,引入下面的eureka-client依赖:

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

2.配置文件

spring:
  application:
    name: orderservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

3.服务拉取,负载均衡

最后,我们要去eureka-server中拉取user-service服务的实例列表,并且实现负载均衡。

不过这些动作不用我们去做,只需要添加一些注解即可。

在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值