微服务总结
知识体系总图:
注册中心
微服务本质是多实例部署,服务间的调用需要一个统一的管理
1. 部署Nacos的注册中心
首先我们要准备MySQL数据库表,用来存储Nacos的数据(需要去资料里找nacos.sql文件)
表的结构如下:
其次需要更改下载下来的nacos文件夹中的custom.env
文件,配置mysql地址
后启动nacos,日访:8848/nacos进入到nacos的控制台,账号密码都是nacos
2.服务注册和发现
添加依赖
1 2 3 4 5
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
|
配置
1 2 3 4 5 6
| spring: application: name: item-service cloud: nacos: server-addr: 192.168.150.101:8848
|
这里Nacos的依赖于服务注册时一致,这个依赖中同时包含了服务注册和发现的功能。即每个服务即是调用者也是服务提供者
OpenFeign
前期准备
引入依赖
1 2 3 4 5 6 7 8 9 10
| <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>
|
在启动类上添加注解:
@EnableFeignClients(basePackages=”com.hmall.api.client”)
注意:需要在括号里声明扫描包
将Feign底层发起http请求的框架由默认的HttpURLConnection改为OKHttp:
引入依赖
1 2 3 4 5
| <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-okhttp</artifactId> </dependency>
|
开启连接池
1 2 3
| feign: okhttp: enabled: true
|
创建统一调度模块
定义一个新的module,命名为hm-api
依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>hmall</artifactId> <groupId>com.heima</groupId> <version>1.0.0</version> </parent> <modelVersion>4.0.0</modelVersion>
<artifactId>hm-api</artifactId>
<properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties>
<dependencies> <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> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> <version>1.6.6</version> <scope>compile</scope> </dependency> </dependencies> </project>
|
编写被调用者接口的OpenFeign客户端
这里以ItemClient举例
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package com.hmall.cart.client;
import com.hmall.cart.domain.dto.ItemDTO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@FeignClient("item-service") public interface ItemClient {
@GetMapping("/items") List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids); }
|
这里只需要声明接口,无需实现方法。接口中的几个关键信息:
@FeignClient("item-service")
:声明服务名称
@GetMapping
:声明请求方式
@GetMapping("/items")
:声明请求路径
@RequestParam("ids") Collection<Long> ids
:声明请求参数
List<ItemDTO>
:返回值类型
有了上述信息,OpenFeign就可以利用动态代理帮我们实现这个方法,并且向http://item-service/items
发送一个GET
请求,携带ids为请求参数,并自动将返回值处理为List<ItemDTO>
。
我们只需要直接调用这个方法,即可实现远程调用了。
调用服务接口
导入hm-api模块
1 2 3 4 5 6
| <dependency> <groupId>com.heima</groupId> <artifactId>hm-api</artifactId> <version>1.0.0</version> </dependency>
|
再在impl中引入需要的客户端接口
1
| private final ItemClient itemClient;
|
使用接口
1
| List<ItemDTO> items=itemClient.queryItemByIds(itemIds);
|
网关