SpringCloud详解02-分布式架构

叁歲伎倆 2024-03-25 15:40 130阅读 0赞

系列文章目录

SpringCloud详解01


文章目录

  • 系列文章目录
  • 前言
  • 一、入门案例
    • 1.创建maven父工程
    • 2.创建子工程 springcloudalibaba-micro-service-commons
    • 3.创建子工程 springcloudalibaba-micro-service-provider-7070
    • 4.创建子工程 springcloudalibaba-micro-service-consumer-8080
  • 二、测试
  • 总结

前言

接着上篇的详解01继续


一、入门案例

因为最新版的某些组件已经不再更新了,此次案例使用的版本是

  • Spring Boot Version: 2.3.2.RELEASE
  • Spring Cloud Version:Spring Cloud Hoxton.SR9
  • Spring Cloud Alibaba Version:2.2.6.RELEASE

接下来,创建分布式模拟案例,我会在一个父工程下创建三个子工程,充当三个服务

1.创建maven父工程

使用IDEA创建一个maven项目,命名为:springcloudalibaba-micro-service-manager,然后导入以下依赖:

  1. <packaging>pom</packaging>
  2. <parent>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-parent</artifactId>
  5. <version>2.3.2.RELEASE</version>
  6. <relativePath/> <!-- lookup parent from repository -->
  7. </parent>
  8. <dependencyManagement>
  9. <dependencies>
  10. <dependency>
  11. <groupId>com.alibaba.cloud</groupId>
  12. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  13. <version>2.2.6.RELEASE</version>
  14. <type>pom</type>
  15. <scope>import</scope>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.cloud</groupId>
  19. <artifactId>spring-cloud-dependencies</artifactId>
  20. <version>Spring Cloud Hoxton.SR9</version>
  21. </dependency>
  22. </dependencies>
  23. </dependencyManagement>

需要注意的是,要修改父工程的打包方式为pom,并且父工程不要留src文件目录,只留一个pom.xml文件即可,第二个依赖会爆红,不过无所谓,不影响代码运行
整体文件内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.lzl</groupId>
  6. <artifactId>springcloudalibaba-micro-service-manager</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <modules>
  9. <module>springcloudalibaba-micro-service-commons</module>
  10. <module>springcloudalibaba-micro-service-provider-7070</module>
  11. <module>springcloudalibaba-micro-service-consumer-8080</module>
  12. </modules>
  13. <packaging>pom</packaging>
  14. <parent>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-parent</artifactId>
  17. <version>2.3.2.RELEASE</version>
  18. <relativePath/> <!-- lookup parent from repository -->
  19. </parent>
  20. <dependencyManagement>
  21. <dependencies>
  22. <dependency>
  23. <groupId>com.alibaba.cloud</groupId>
  24. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  25. <version>2.2.6.RELEASE</version>
  26. <type>pom</type>
  27. <scope>import</scope>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.cloud</groupId>
  31. <artifactId>spring-cloud-dependencies</artifactId>
  32. <version>Spring Cloud Hoxton.SR9</version>
  33. </dependency>
  34. </dependencies>
  35. </dependencyManagement>
  36. </project>

2.创建子工程 springcloudalibaba-micro-service-commons

在父工程下创建maven子工程springcloudalibaba-micro-service-commons,pom.xml文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <parent>
  5. <artifactId>springcloudalibaba-micro-service-manager</artifactId>
  6. <groupId>com.lzl</groupId>
  7. <version>1.0-SNAPSHOT</version>
  8. </parent>
  9. <modelVersion>4.0.0</modelVersion>
  10. <artifactId>springcloudalibaba-micro-service-commons</artifactId>
  11. <dependencies>
  12. <dependency>
  13. <groupId>org.projectlombok</groupId>
  14. <artifactId>lombok</artifactId>
  15. <version>1.18.24</version>
  16. </dependency>
  17. </dependencies>
  18. </project>

这个子工程用来充当基本服务组件的提供,所以我们在该工程下创建实体类和工具类,并填入相关内容,此处我初始化一个UserDto实体类,并copy了一个返回值的工具类过来,内容如下:

UserDto:

  1. package com.lzl.dto;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. /**
  6. * --效率,是成功的核心关键--
  7. *
  8. * @Author lzl
  9. * @Date 2023/3/15 15:00
  10. */
  11. @Data
  12. @AllArgsConstructor
  13. @NoArgsConstructor
  14. public class UserDto {
  15. private Integer id;
  16. private String name;
  17. }

JsonResult:

  1. package com.lzl.utils;
  2. import lombok.Data;
  3. /**
  4. * --效率,是成功的核心关键--
  5. *
  6. * @Author lzl
  7. * @Date 2023/3/15 15:01
  8. */
  9. @Data
  10. public class JsonResult<T> {
  11. private Integer code;//状态码
  12. private String msg;//返回消息说明
  13. private T data;
  14. /**
  15. * 成功返回方法
  16. * @return
  17. */
  18. public static JsonResult ok(){
  19. JsonResult jsonResult = new JsonResult<>();
  20. jsonResult.setCode(200);
  21. jsonResult.setMsg("success");
  22. return jsonResult;
  23. }
  24. /**
  25. * 失败返回方法
  26. * @return
  27. */
  28. public static JsonResult error(){
  29. JsonResult jsonResult = new JsonResult<>();
  30. jsonResult.setCode(-1);
  31. jsonResult.setMsg("fail");
  32. return jsonResult;
  33. }
  34. }

目录如下:
在这里插入图片描述

3.创建子工程 springcloudalibaba-micro-service-provider-7070

在父工程下创建子工程springcloudalibaba-micro-service-provider-7070,pom.xml文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <parent>
  5. <artifactId>springcloudalibaba-micro-service-manager</artifactId>
  6. <groupId>com.lzl</groupId>
  7. <version>1.0-SNAPSHOT</version>
  8. </parent>
  9. <modelVersion>4.0.0</modelVersion>
  10. <artifactId>springcloudalibaba-micro-service-provider-7070</artifactId>
  11. <dependencies>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-web</artifactId>
  15. </dependency>
  16. <!-- 注册到Nacos上 -->
  17. <dependency>
  18. <groupId>com.alibaba.cloud</groupId>
  19. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  20. </dependency>
  21. <!-- 引入公共模块 -->
  22. <dependency>
  23. <groupId>com.lzl</groupId>
  24. <artifactId>springcloudalibaba-micro-service-commons</artifactId>
  25. <version>1.0-SNAPSHOT</version>
  26. </dependency>
  27. </dependencies>
  28. </project>

配置yml文件:

  1. spring:
  2. application:
  3. name: provider
  4. cloud:
  5. nacos:
  6. discovery:
  7. register-enabled: true
  8. server-addr: 127.0.0.1:8848
  9. server:
  10. port: 7070

作为服务提供方,需要提供功能方法的具体实现,这里我简化一下,不再编写service层,直接在controller层模拟数据库查询功能

  1. package com.lzl.controller;
  2. import com.lzl.dto.UserDto;
  3. import com.lzl.utils.JsonResult;
  4. import org.springframework.web.bind.annotation.*;
  5. import java.util.Arrays;
  6. import java.util.List;
  7. /**
  8. * --效率,是成功的核心关键--
  9. *
  10. * @Author lzl
  11. * @Date 2023/3/15 15:19
  12. */
  13. @RestController
  14. @RequestMapping("user-provider")
  15. public class UserController {
  16. @RequestMapping("findAll")
  17. public JsonResult findAll(){
  18. //模拟数据库中的数据
  19. List<UserDto> userList = Arrays.asList(
  20. new UserDto(1001, "张三"),
  21. new UserDto(1002, "李四"),
  22. new UserDto(1003, "王五")
  23. );
  24. JsonResult jsonResult = JsonResult.ok();
  25. jsonResult.setData(userList);
  26. return jsonResult;
  27. }
  28. }

创建启动类,开启服务扫描

  1. package com.lzl;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. /**
  6. * --效率,是成功的核心关键--
  7. *
  8. * @Author lzl
  9. * @Date 2023/3/15 15:20
  10. */
  11. @SpringBootApplication
  12. @EnableDiscoveryClient//发现服务
  13. public class ProviderApplication {
  14. public static void main(String[] args) {
  15. SpringApplication.run(ProviderApplication.class,args);
  16. }
  17. }

目录结构如下:
在这里插入图片描述

4.创建子工程 springcloudalibaba-micro-service-consumer-8080

在父工程下创建子工程 springcloudalibaba-micro-service-consumer-8080作为服务消费,pom.xml文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <parent>
  5. <artifactId>springcloudalibaba-micro-service-manager</artifactId>
  6. <groupId>com.lzl</groupId>
  7. <version>1.0-SNAPSHOT</version>
  8. </parent>
  9. <modelVersion>4.0.0</modelVersion>
  10. <artifactId>springcloudalibaba-micro-service-consumer-8080</artifactId>
  11. <dependencies>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-web</artifactId>
  15. </dependency>
  16. <!-- 注册到Nacos上 -->
  17. <dependency>
  18. <groupId>com.alibaba.cloud</groupId>
  19. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  20. </dependency>
  21. <!-- 引入公共模块 -->
  22. <dependency>
  23. <groupId>com.lzl</groupId>
  24. <artifactId>springcloudalibaba-micro-service-commons</artifactId>
  25. <version>1.0-SNAPSHOT</version>
  26. </dependency>
  27. <!-- Feign -->
  28. <dependency>
  29. <groupId>org.springframework.cloud</groupId>
  30. <artifactId>spring-cloud-starter-openfeign</artifactId>
  31. <version>2.2.6.RELEASE</version>
  32. </dependency>
  33. </dependencies>
  34. </project>

yml配置文件

  1. spring:
  2. application:
  3. name: consumer
  4. cloud:
  5. nacos:
  6. discovery:
  7. register-enabled: true
  8. server-addr: 127.0.0.1:8848
  9. server:
  10. port: 8081

添加配置类WebConfig

  1. package com.lzl.config;
  2. import com.netflix.loadbalancer.IRule;
  3. import com.netflix.loadbalancer.RandomRule;
  4. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.web.client.RestTemplate;
  8. /**
  9. * --效率,是成功的核心关键--
  10. *
  11. * @Author lzl
  12. * @Date 2023/3/15 15:11
  13. */
  14. @Configuration
  15. public class WebConfig {
  16. @Bean
  17. public RestTemplate restTemplate(){
  18. return new RestTemplate();
  19. }
  20. }

controller

  1. package com.lzl.controller;
  2. import com.lzl.utils.JsonResult;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.cloud.client.ServiceInstance;
  5. import org.springframework.cloud.client.discovery.DiscoveryClient;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import org.springframework.web.client.RestTemplate;
  9. import java.util.List;
  10. /**
  11. * --效率,是成功的核心关键--
  12. *
  13. * @Author lzl
  14. * @Date 2023/3/15 15:12
  15. */
  16. @RestController
  17. @RequestMapping("user-consumer")
  18. public class UserController {
  19. @Autowired
  20. private RestTemplate restTemplate;//调用服务
  21. @Autowired
  22. private DiscoveryClient discoveryClient;//获取服务参数
  23. //消费方应该调用生产方的服务
  24. @RequestMapping("findAll")
  25. public JsonResult findAll(){
  26. //获取服务提供方的ip,端口
  27. //通过名称去获取
  28. List<ServiceInstance> provider = discoveryClient.getInstances("provider");
  29. //服务提供方对象
  30. ServiceInstance serviceInstance = provider.get(0);
  31. //拿ip
  32. String host = serviceInstance.getHost();
  33. //拿端口
  34. int port = serviceInstance.getPort();
  35. //访问地址
  36. String url = "http://" + host + ":" + port + "/user-provider/findAll";
  37. //调用服务
  38. JsonResult jsonResult = restTemplate.getForObject(url, JsonResult.class);
  39. return jsonResult;
  40. }
  41. }

设置启动类

  1. package com.lzl;
  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. /**
  7. * --效率,是成功的核心关键--
  8. *
  9. * @Author lzl
  10. * @Date 2023/3/15 15:16
  11. */
  12. @SpringBootApplication
  13. @EnableDiscoveryClient//服务扫描注解
  14. public class ConsumerApplication {
  15. public static void main(String[] args) {
  16. SpringApplication.run(ConsumerApplication.class,args);
  17. }
  18. }

整体的目录结构如下

在这里插入图片描述

ps:马赛克部分是其它的功能

二、测试

首先打开我们的nacos,出现运行成功界面,然后在浏览器访问http://localhost:8848/nacos/\#/login,输入默认的帐号密码,进入,

在这里插入图片描述

然后在IDEA启动提供服务方springcloudalibaba-micro-service-provider-7070,接着启动服务消费方springcloudalibaba-micro-service-consumer-8080

启动成功后访问http://localhost:8081/user-consumer/findAll

在这里插入图片描述

成功


总结

本篇主要记录了nacos和分布式架构的模拟案例,接下来的内容会在下一篇更新

发表评论

表情:
评论列表 (有 0 条评论,130人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringCloud分布式架构权限管理

    概述 本文讨论分布式架构权限管理的两种情况,一种是针对统一授权访问的,一种是跨平台接口访问的。 虽然分布式架构会做业务的切割,将整体的业务切割为独立的子业务或者子平台,