当前位置:   article > 正文

【SpringCloud Alibaba】Nacos服务管理与Feign负载均衡_feign nacos负载均衡

feign nacos负载均衡

目录

一、微服务搭建

1.1 服务提供者与服务消费者

1.2 依赖关系

 

二、服务注册与负载均衡使用

2.1 Nacos 实现服务的注册与发现

2.2 Loadbalancer负载均衡、Feign声明式服务调用

2.3 示例综合实现

2.3.1 服务注册与发现测试

2.3.2 负载均衡测试 


一、微服务搭建

1.1 服务提供者与服务消费者

服务提供者服务的被调用方(即:为其他微服务提供接口的微服务)
服务消费者服务的调用方(即:调用其他微服务接口的微服务)

 就以图(仅供娱乐,无不良影响)为例搭建一个简单的微服务项目,可以看到一下项目结构:

cloud (父级项目,这样为了更好管理项目资源):


  • basketball (生产者) 
  • common (公共资源)
  • ikun (消费者)

1.2 依赖关系

1、Cloud顶级模块pom文件 (完整) :

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://maven.apache.org/POM/4.0.0"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.example</groupId>
  7. <artifactId>cloud</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <packaging>pom</packaging>
  10. <!--定义子模块-->
  11. <modules>
  12. <module>ikun</module>
  13. <module>basketball</module>
  14. <module>common</module>
  15. </modules>
  16. <!--依赖版本-->
  17. <properties>
  18. <spring-boot.version>2.4.2</spring-boot.version>
  19. <spring-cloud.version>2020.0.1</spring-cloud.version>
  20. <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
  21. </properties>
  22. <dependencies>
  23. <!--nacos服务注册-->
  24. <dependency>
  25. <groupId>com.alibaba.cloud</groupId>
  26. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  27. </dependency>
  28. <!--Orika是java Bean映射框架,可以实现从一个对象递归拷贝数据至另一个对象。-->
  29. <dependency>
  30. <groupId>ma.glasnost.orika</groupId>
  31. <artifactId>orika-core</artifactId>
  32. <version>1.4.6</version>
  33. </dependency>
  34. <!--提供负载均衡的支持-->
  35. <dependency>
  36. <groupId>org.springframework.cloud</groupId>
  37. <artifactId>spring-cloud-loadbalancer</artifactId>
  38. </dependency>
  39. <!--简化 Java 代码的工具库-->
  40. <dependency>
  41. <groupId>org.projectlombok</groupId>
  42. <artifactId>lombok</artifactId>
  43. </dependency>
  44. <!--开启负载均衡-->
  45. <dependency>
  46. <groupId>org.springframework.cloud</groupId>
  47. <artifactId>spring-cloud-starter-openfeign</artifactId>
  48. </dependency>
  49. </dependencies>
  50. <!--声明的依赖版本号可以被子模块引用,但不会自动引入这些依赖-->
  51. <dependencyManagement>
  52. <dependencies>
  53. <dependency>
  54. <groupId>org.springframework.boot</groupId>
  55. <artifactId>spring-boot-dependencies</artifactId>
  56. <version>${spring-boot.version}</version>
  57. <type>pom</type>
  58. <scope>import</scope>
  59. </dependency>
  60. <dependency>
  61. <groupId>org.springframework.cloud</groupId>
  62. <artifactId>spring-cloud-dependencies</artifactId>
  63. <version>${spring-cloud.version}</version>
  64. <type>pom</type>
  65. <scope>import</scope>
  66. </dependency>
  67. <dependency>
  68. <groupId>com.alibaba.cloud</groupId>
  69. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  70. <version>${spring-cloud-alibaba.version}</version>
  71. <type>pom</type>
  72. <scope>import</scope>
  73. </dependency>
  74. </dependencies>
  75. </dependencyManagement>
  76. </project>

        在父级中指定了子模块,子模块需要引用父级模块就能同步使用父级依赖,这样就可以把所有子模块共同依赖同意管理。

2、ikun子模块pom: (basketball如同)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.example</groupId>
  6. <artifactId>ikun</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <!--引用父模块依赖-->
  9. <parent>
  10. <groupId>org.example</groupId>
  11. <artifactId>cloud</artifactId>
  12. <version>1.0-SNAPSHOT</version>
  13. </parent>
  14. <dependencies>
  15. <dependency>
  16. <groupId>org.springframework.boot</groupId>
  17. <artifactId>spring-boot-starter-web</artifactId>
  18. </dependency>
  19. <!--引入公共模块-->
  20. <dependency>
  21. <groupId>org.example</groupId>
  22. <artifactId>common</artifactId>
  23. <version>1.0-SNAPSHOT</version>
  24. </dependency>
  25. </dependencies>
  26. <build>
  27. <plugins>
  28. <plugin>
  29. <groupId>org.apache.maven.plugins</groupId>
  30. <artifactId>maven-compiler-plugin</artifactId>
  31. <version>3.8.1</version>
  32. <configuration>
  33. <source>1.8</source>
  34. <target>1.8</target>
  35. <encoding>UTF-8</encoding>
  36. </configuration>
  37. </plugin>
  38. <plugin>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-maven-plugin</artifactId>
  41. <version>${spring-boot.version}</version>
  42. <configuration>
  43. <mainClass>com.example.ikun.IkunApplication</mainClass>
  44. </configuration>
  45. <executions>
  46. <execution>
  47. <id>repackage</id>
  48. <goals>
  49. <goal>repackage</goal>
  50. </goals>
  51. </execution>
  52. </executions>
  53. </plugin>
  54. </plugins>
  55. </build>
  56. </project>

        

二、服务注册与负载均衡使用

     以上的操作只是建造了一个空壳,我们需要通过一些组件来继续完善微服务体系结构。

2.1 Nacos 实现服务的注册与发现

Nacos下载:Releases · alibaba/nacos · GitHub

1、添加依赖

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  4. </dependency>

2、配置服务提供者,从而服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上。

basketball(服务提供者)配置Nacos server 的地址:

  1. server:
  2. port: 8080
  3. spring:
  4. cloud:
  5. nacos:
  6. server-addr: localhost:8848
  7. application:
  8. name: basketball

 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:

  1. package com.example.basketball;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. import org.springframework.cloud.openfeign.EnableFeignClients;
  6. @SpringBootApplication
  7. @EnableDiscoveryClient
  8. @EnableFeignClients
  9. public class BasketballApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(BasketballApplication.class, args);
  12. }
  13. }

3、配置服务消费者,从而服务消费者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。

ikun(服务消费者)中配置 Nacos server 的地址:

  1. server:
  2. port: 8081
  3. spring:
  4. cloud:
  5. nacos:
  6. server-addr: localhost:8848
  7. application:
  8. name: ikun

通上在启动类上添加 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能。

2.2 Loadbalancer负载均衡、Feign声明式服务调用

因为两个子模块都需要此组件,所以直接在父模块cloud添加负载均衡依赖:

  1. <!--提供负载均衡的支持-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-loadbalancer</artifactId>
  5. </dependency>
  6. <!--远程服务通信-->
  7. <dependency>
  8. <groupId>org.springframework.cloud</groupId>
  9. <artifactId>spring-cloud-starter-openfeign</artifactId>
  10. </dependency>

在两个子模块启动类添加注释开启服务通信

@EnableFeignClients

2.3 示例综合实现

那么所有配置都已搭建好,接下来编写api接口来实现服务通信与负载均衡:

1、准备一个实体与dto类,因为本次示例并没有连接数据库,仅仅编写一个类用于实例化数据。这里我准备了一个公共模块(common)用来放置公共所需的类

  1. package pojo.dto;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. /**
  6. * @author 云村小威
  7. * @create 2024-01-06 15:52
  8. */
  9. @Data
  10. @NoArgsConstructor
  11. @AllArgsConstructor
  12. public class IkunDto {
  13. private Long id;
  14. private String account;
  15. private String password;
  16. private Integer age;
  17. private String hobby;
  18. }

消费者 远程调用 生产者 : 需要网络传输,使用DTO同一封装对象 原理与SpringBoot启动类相同

  1. 将DTO对象封装到公共DTO模块
  2. 为需要的项目引入公共DTO模块
  1. <!--引入公共模块-->
  2. <dependency>
  3. <groupId>org.example</groupId>
  4. <artifactId>common</artifactId>
  5. <version>1.0-SNAPSHOT</version>
  6. </dependency>

注意点:

  • 不需要继承父模块(重复引用问题)
  • 打包方式为jar
  • 不需要添加启动类的编译 

 VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据 封装起来。

DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是 为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的 性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。

DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。 PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一 一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应 PO的一个(或若干个)属性。

2、服务提供者(basketball)

提供接口方法和返回结果

  1. package com.example.basketball.controller;
  2. import pojo.dto.IkunDto;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.web.bind.annotation.*;
  5. import java.util.Map;
  6. @Slf4j
  7. @RestController
  8. @RequestMapping("/kun")
  9. public class CXKController {
  10. @RequestMapping("/{account}")
  11. public String getByPath(@PathVariable String account) {
  12. log.info("account:" + account);
  13. return "kun : 唱";
  14. }
  15. @RequestMapping("/param")
  16. public String getByParam(@RequestParam("account") String account,
  17. @RequestParam("password") String password) {
  18. log.info("param:" + account + "\t" + password);
  19. return "kun : 跳";
  20. }
  21. @RequestMapping("/pojo")
  22. public String getByPojo(@RequestBody IkunDto ikunDto) {
  23. log.info("dto:" + ikunDto);
  24. return "kun : rep";
  25. }
  26. @RequestMapping("/more")
  27. public String getByMore(@RequestBody Map<String, Object> map) {
  28. log.info("more:" + map);
  29. return "
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/47811
    推荐阅读
    相关标签