微服务思想以及实现


前言

什么时候去拆分微服务?怎么拆分?拆分后微服务项目之间的业务怎么调用?


一、什么时候需要拆分微服务

1. 创业型项目

如果是创业型公司,最好先用单体架构快速迭代开发,验证市场运作模型,快速试错。当业务跑通以后,随着业务规模扩大、人员规模增加,再考虑拆分微服务。

2. 大型项目

如果是大型企业,有充足的资源,可以在项目开始之初就搭建微服务架构。

二、怎么拆

1. 拆分目标

  • 高内聚:每个微服务的职责要尽量单一,包含的业务相互关联度高、完整度高。
  • 低耦合:每个微服务的功能要相对独立,尽量减少对其它微服务的依赖。

2. 拆分方式

  • 纵向拆分:按照业务模块来拆分
  • 横向拆分:抽取公共服务,提高复用性

三、微服务之间远程调用

1. 实现方式

  • 基于Http协议(不关心服务提供者的具体技术实现,只要对外暴露Http接口即可,更符合微服务的需要)
  • 基于Dubbo协议

2. 手动发送Http请求(RestTemplate)

Java发送http请求可以使用Spring提供的RestTemplate
实现步骤:
1、注入RestTemplate到Spring容器

@Bean
public RestTemplate restTemplate(){
    return new RestTemplate();
}

2、发起远程调用

// 利用RestTemplate发起http请求,得到http的响应
ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
        "http://localhost:8081/items?ids={ids}",
        HttpMethod.GET,
        null,
        new ParameterizedTypeReference<List<ItemDTO>>() {},
        Map.of("ids", CollUtil.join(itemIds, ","))
);

3. 服务注册中心

问题引入:微服务项目a(服务提供者)多实例部署,每个实例其IP或端口不同,当微服务项目b(服务消费者)要远程调用a时不知道调用哪个。

3.1 原理

在这里插入图片描述
三个角色
服务提供者:暴露服务接口,供其它服务调用
服务消费者:调用其它服务提供的接口
注册中心:记录并监控微服务各实例状态,推送服务变更信息
流程

  1. 服务启动时就会注册自己的服务信息(服务名、IP、端口)到注册中心
  2. 调用者可以从注册中心订阅想要的服务,获取服务对应的实例列表(1个服务可能多实例部署)
  3. 调用者自己对实例列表负载均衡,挑选一个实例
  4. 调用者向该实例发起远程调用

服务状态变更
服务提供者通过心跳机制向注册中心报告自己的健康状态,当心跳异常时注册中心会将异常服务剔除,并通知订阅了该服务的消费者

3.2 Nacos注册中心

Alibaba公司出品,目前被集成在SpringCloudAlibaba中
基于Docker来部署Nacos的注册中心
(1)准备nacos.sql数据库表,并导入到sql客户端
(2)再将sql文件导入到Docker中的MySQL容器中

3.3 服务注册

1、引入依赖

  <!--nacos 服务注册发现-->
  <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  </dependency>

2、配置Nacos地址

spring:
  application:
      name: item-service # 服务名称
  cloud:
    nacos:
      server-addr: 192.168.xxx.xxx:xxx   # nacos地址

3、启动服务实例
在这里插入图片描述

3.4 服务发现(DiscoveryClient)

服务的消费者要去nacos订阅服务,这个过程就是服务发现。
步骤(步骤1、2和前面一样)
1、引入依赖
2、配置Nacos地址
3、发现并调用服务
DiscoveryClient,SpringCloud已经自动装配,只要注入就好。
在这里插入图片描述

4. OpenFeign

问题引入:利用RestTemplate实现了服务的远程调用,代码复杂。如何让远程调用像本地方法调用一样简单
概念:声明式的http客户端,利用SpringMVC的常见注解,基于动态代理生成远程调用的代码,而无需手动再编写,非常方便。

4.1 实现步骤

1、引入依赖,包括OpenFeign和负载均衡组件SpringCloudLoadBalancer

  <!--openFeign-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>
  <!--负载均衡器-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  </dependency>

2、在启动类中添加@EnableFeignClients注解,启用OpenFeign功能

@EnableFeignClients(basePackages = "com.hmall.api.client", defaultConfiguration = DefaultFeignConfig.class)
//basePackages = "com.hmall.api.client"因为是把微服务项目业务抽取到hm-api这个模块中,要调用这个模块中的方法,需要扫描到这个包下,并在FeignClient中药声明服务名称
@MapperScan("com.hmall.cart.mapper")
@SpringBootApplication
public class CartApplication {
    public static void main(String[] args) {
        SpringApplication.run(CartApplication.class, args);
    }
}

3、声明接口,无需实现方法,在接口上添加FeignClient注解

@FeignClient("item-service")  //声明服务名称
public interface ItemClient {
    @GetMapping("/items")  //声明请求方式、请求路径
    List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}

4、使用FeignClient,实现远程调用

List<ItemDTO> items = itemClient.queryItemByIds(List.of(1,2,3))

4.2 连接池

Feign底层发起http请求,依赖于其它的框架。其底层支持的http客户端实现包括:

  • HttpURLConnection:默认实现,不支持连接池
  • Apache HttpClient :支持连接池
  • OKHttp:支持连接池
    使用OKHttp步骤
    1、引入依赖
<!--OK http 的依赖 -->
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-okhttp</artifactId>
</dependency>

2、开启连接池

feign:
  okhttp:
    enabled: true # 开启OKHttp功能

5. 抽取Fegin客户端

问题引入:微服务项目之间的调用复杂,不同的微服务项目调用同一个微服务项目,会出现代码重复的问题。

实现方式

  • 思路1:抽取到微服务之外的公共module。结构清晰但耦合度偏高
  • 思路2:每个微服务自己抽取一个module。结构复杂但耦合度低
    在这里插入图片描述
    具体代码实现参考黑马微服务开发https://www.bilibili.com/video/BV1S142197x7?p=64&vd_source=d7aecc6c1f43adaae25fcb7e1a25fec2

6. 日志

FeignClient所在包的日志级别为DEBUG时,才会输出日志

6.1 级别

  • NONE:不记录任何日志信息,这是默认值。
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

6.2 实现步骤

1、在抽取各个微服务通用业务的hm-api模块下新建一个配置类

package com.hmall.api.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
public class DefaultFeignConfig {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.FULL;
    }
}

2、配置,让日志级别生效
局部配置:在某个FeignClient中配置,只对当前FeignClient生效

@FeignClient(value = "item-service", configuration = DefaultFeignConfig.class)

全局配置:在@EnableFeignClients中配置,针对所有FeignClient生效

@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)
  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在使用 Java Spring Boot 框架实现微服务的员工点餐系统中,我们需要按照微服务架构思想进行设计和开发。具体来说,需要将系统拆分成一些独立的微服务模块,每个模块负责一个特定的功能。 - 订单服务:负责管理订单,包括创建订单、修改订单、查询订单等功能。 - 食品服务:负责管理食品菜单,包括添加食品、修改食品、查询食品等功能。 - 用户服务:负责管理用户,包括添加用户、修改用户、查询用户等功能。 对于不同服务之间的交互,我们可以使用 REST API 来实现,例如订单服务可以通过调用食品服务的 REST API 来获取食品信息。 为了简化服务之间的交互,可以使用服务发现和注册工具,如 Eureka 或 Consul。这样可以让服务之间的依赖解耦,减少系统的耦合性。 最后,为了保证系统的可靠性和高可用性,我们可以使用分布式配置管理工具,如 Spring Cloud Config,这样可以使系统在多个节点上部署,并在 ### 回答2: 要使用Java Spring Boot框架实现微服务的员工点餐系统,需要按照以下步骤进行: 首先,需要创建一个Spring Boot项目,并添加所需的依赖项,如Spring Web、Spring Data JPA、Spring Cloud等。这些依赖项将提供用于创建RESTful API、操作数据库以及构建微服务架构的功能。 接下来,定义员工、菜单、订单等实体类,并创建相应的数据库表和关联关系。使用Spring Data JPA来简化数据库操作,通过注解定义实体类与数据库表的映射关系,以及各种查询方法。 然后,创建员工服务、菜单服务和订单服务等微服务。每个微服务都可以作为独立的Spring Boot应用运行,但是它们之间需要通过RESTful API进行通信。可以使用Spring Cloud的服务注册与发现功能来注册每个微服务,并使用Feign客户端来调用其他微服务的API。 为了实现点餐功能,可以创建一个订单微服务,它允许员工查看菜单列表、选择菜品以及提交订单。该微服务需要调用菜单微服务获取菜单数据,并将订单数据存储到数据库中。可以使用Spring Security来进行身份验证和授权,确保只有授权的员工可以访问此服务。 最后,创建一个前端界面,让员工可以方便地浏览菜单并下单。可以使用前端框架如React或Angular来构建交互界面,并通过RESTful API调用后端微服务。前端界面应提供员工登录、菜单展示、菜品选择以及订单提交等功能。 通过以上步骤,使用Java Spring Boot框架可以快速实现微服务的员工点餐系统。这种架构可以提高系统的可扩展性、灵活性和可维护性,同时通过服务拆分和解耦,使得系统更易于开发和维护。 ### 回答3: 使用Java Spring Boot框架可以实现一个微服务的员工点餐系统,以下是具体步骤: 1. 定义数据模型:首先需要定义员工、菜品和订单的数据模型,并进行数据库表的设计和创建。 2. 创建微服务:使用Spring Boot框架创建三个微服务,分别为员工服务、菜品服务和订单服务。每个微服务包含相应的API接口和业务逻辑。 3. 员工服务:员工服务负责员工的管理,包括员工的添加、删除、修改和查询等功能。可以使用Spring Data JPA进行数据库操作。 4. 菜品服务:菜品服务负责菜品的管理,包括菜品的添加、删除、修改和查询等功能。同样可以使用Spring Data JPA进行数据库操作。 5. 订单服务:订单服务负责接收员工的点餐请求,生成订单,并保存到数据库中。同时还可以提供订单的查询功能。 6. 服务间通信:在微服务之间进行通信可以使用RESTful API。员工服务和菜品服务可以相互调用,订单服务可以调用员工服务和菜品服务以获取员工和菜品信息。 7. 配置文件:在配置文件中定义数据库连接信息、端口号等配置项。 8. 测试和部署:编写相应的测试用例对各个微服务进行测试,并使用Docker等工具将微服务部署到相应的服务器上。 综上所述,使用Java Spring Boot框架可以快速搭建一个微服务的员工点餐系统,实现员工、菜品和订单的管理和查询功能。同时,通过微服务之间的通信,可以提高系统的扩展性和灵活性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值