赞
踩
目录
2.2 Loadbalancer负载均衡、Feign声明式服务调用
| 服务提供者 | 服务的被调用方(即:为其他微服务提供接口的微服务) |
| 服务消费者 | 服务的调用方(即:调用其他微服务接口的微服务) |

就以图(仅供娱乐,无不良影响)为例搭建一个简单的微服务项目,可以看到一下项目结构:
cloud (父级项目,这样为了更好管理项目资源):
- basketball (生产者)
- common (公共资源)
- ikun (消费者)
1、Cloud顶级模块pom文件 (完整) :
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://maven.apache.org/POM/4.0.0"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.example</groupId>
- <artifactId>cloud</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>pom</packaging>
-
- <!--定义子模块-->
- <modules>
- <module>ikun</module>
- <module>basketball</module>
- <module>common</module>
- </modules>
-
- <!--依赖版本-->
- <properties>
- <spring-boot.version>2.4.2</spring-boot.version>
- <spring-cloud.version>2020.0.1</spring-cloud.version>
- <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
- </properties>
-
- <dependencies>
- <!--nacos服务注册-->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- </dependency>
- <!--Orika是java Bean映射框架,可以实现从一个对象递归拷贝数据至另一个对象。-->
- <dependency>
- <groupId>ma.glasnost.orika</groupId>
- <artifactId>orika-core</artifactId>
- <version>1.4.6</version>
- </dependency>
- <!--提供负载均衡的支持-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-loadbalancer</artifactId>
- </dependency>
- <!--简化 Java 代码的工具库-->
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- </dependency>
- <!--开启负载均衡-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-openfeign</artifactId>
- </dependency>
- </dependencies>
-
- <!--声明的依赖版本号可以被子模块引用,但不会自动引入这些依赖-->
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-dependencies</artifactId>
- <version>${spring-boot.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-alibaba-dependencies</artifactId>
- <version>${spring-cloud-alibaba.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
-
- </project>

在父级中指定了子模块,子模块需要引用父级模块就能同步使用父级依赖,这样就可以把所有子模块共同依赖同意管理。
2、ikun子模块pom: (basketball如同)
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.example</groupId>
- <artifactId>ikun</artifactId>
- <version>0.0.1-SNAPSHOT</version>
-
- <!--引用父模块依赖-->
- <parent>
- <groupId>org.example</groupId>
- <artifactId>cloud</artifactId>
- <version>1.0-SNAPSHOT</version>
- </parent>
-
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <!--引入公共模块-->
- <dependency>
- <groupId>org.example</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.8.1</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- <encoding>UTF-8</encoding>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <version>${spring-boot.version}</version>
- <configuration>
- <mainClass>com.example.ikun.IkunApplication</mainClass>
- </configuration>
- <executions>
- <execution>
- <id>repackage</id>
- <goals>
- <goal>repackage</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-
- </project>

以上的操作只是建造了一个空壳,我们需要通过一些组件来继续完善微服务体系结构。
1、添加依赖
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- </dependency>
2、配置服务提供者,从而服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上。
basketball(服务提供者)配置Nacos server 的地址:
- server:
- port: 8080
- spring:
- cloud:
- nacos:
- server-addr: localhost:8848
- application:
- name: basketball
通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
package com.example.basketball; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class BasketballApplication { public static void main(String[] args) { SpringApplication.run(BasketballApplication.class, args); } }
3、配置服务消费者,从而服务消费者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。
ikun(服务消费者)中配置 Nacos server 的地址:
- server:
- port: 8081
- spring:
- cloud:
- nacos:
- server-addr: localhost:8848
- application:
- name: ikun
通上在启动类上添加 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能。
因为两个子模块都需要此组件,所以直接在父模块cloud添加负载均衡依赖:
- <!--提供负载均衡的支持-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-loadbalancer</artifactId>
- </dependency>
-
- <!--远程服务通信-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-openfeign</artifactId>
- </dependency>
在两个子模块启动类添加注释开启服务通信
@EnableFeignClients
那么所有配置都已搭建好,接下来编写api接口来实现服务通信与负载均衡:
1、准备一个实体与dto类,因为本次示例并没有连接数据库,仅仅编写一个类用于实例化数据。这里我准备了一个公共模块(common)用来放置公共所需的类
- package pojo.dto;
-
- import lombok.AllArgsConstructor;
- import lombok.Data;
- import lombok.NoArgsConstructor;
-
- /**
- * @author 云村小威
- * @create 2024-01-06 15:52
- */
- @Data
- @NoArgsConstructor
- @AllArgsConstructor
- public class IkunDto {
-
- private Long id;
- private String account;
- private String password;
- private Integer age;
- private String hobby;
-
- }

消费者 远程调用 生产者 : 需要网络传输,使用DTO同一封装对象 原理与SpringBoot启动类相同
- <!--引入公共模块-->
- <dependency>
- <groupId>org.example</groupId>
- <artifactId>common</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
注意点:
- 不需要继承父模块(重复引用问题)
- 打包方式为jar
- 不需要添加启动类的编译
VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据 封装起来。
DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是 为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的 性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。 PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一 一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应 PO的一个(或若干个)属性。
2、服务提供者(basketball)
提供接口方法和返回结果
- package com.example.basketball.controller;
-
- import pojo.dto.IkunDto;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.web.bind.annotation.*;
-
- import java.util.Map;
-
- @Slf4j
- @RestController
- @RequestMapping("/kun")
- public class CXKController {
-
-
- @RequestMapping("/{account}")
- public String getByPath(@PathVariable String account) {
- log.info("account:" + account);
- return "kun : 唱";
- }
-
- @RequestMapping("/param")
- public String getByParam(@RequestParam("account") String account,
- @RequestParam("password") String password) {
- log.info("param:" + account + "\t" + password);
- return "kun : 跳";
- }
-
- @RequestMapping("/pojo")
- public String getByPojo(@RequestBody IkunDto ikunDto) {
- log.info("dto:" + ikunDto);
- return "kun : rep";
- }
-
- @RequestMapping("/more")
- public String getByMore(@RequestBody Map<String, Object> map) {
- log.info("more:" + map);
- return "声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/47811推荐阅读
相关标签
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。