SpringCloud详解02-分布式架构
系列文章目录
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,然后导入以下依赖:
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Spring Cloud Hoxton.SR9</version>
</dependency>
</dependencies>
</dependencyManagement>
需要注意的是,要修改父工程的打包方式为pom,并且父工程不要留src文件目录,只留一个pom.xml文件即可,第二个依赖会爆红,不过无所谓,不影响代码运行
整体文件内容如下:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lzl</groupId>
<artifactId>springcloudalibaba-micro-service-manager</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>springcloudalibaba-micro-service-commons</module>
<module>springcloudalibaba-micro-service-provider-7070</module>
<module>springcloudalibaba-micro-service-consumer-8080</module>
</modules>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Spring Cloud Hoxton.SR9</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2.创建子工程 springcloudalibaba-micro-service-commons
在父工程下创建maven子工程springcloudalibaba-micro-service-commons,pom.xml文件如下:
<?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>springcloudalibaba-micro-service-manager</artifactId>
<groupId>com.lzl</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloudalibaba-micro-service-commons</artifactId>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>
</project>
这个子工程用来充当基本服务组件的提供,所以我们在该工程下创建实体类和工具类,并填入相关内容,此处我初始化一个UserDto实体类,并copy了一个返回值的工具类过来,内容如下:
UserDto:
package com.lzl.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* --效率,是成功的核心关键--
*
* @Author lzl
* @Date 2023/3/15 15:00
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDto {
private Integer id;
private String name;
}
JsonResult:
package com.lzl.utils;
import lombok.Data;
/**
* --效率,是成功的核心关键--
*
* @Author lzl
* @Date 2023/3/15 15:01
*/
@Data
public class JsonResult<T> {
private Integer code;//状态码
private String msg;//返回消息说明
private T data;
/**
* 成功返回方法
* @return
*/
public static JsonResult ok(){
JsonResult jsonResult = new JsonResult<>();
jsonResult.setCode(200);
jsonResult.setMsg("success");
return jsonResult;
}
/**
* 失败返回方法
* @return
*/
public static JsonResult error(){
JsonResult jsonResult = new JsonResult<>();
jsonResult.setCode(-1);
jsonResult.setMsg("fail");
return jsonResult;
}
}
目录如下:
3.创建子工程 springcloudalibaba-micro-service-provider-7070
在父工程下创建子工程springcloudalibaba-micro-service-provider-7070,pom.xml文件如下:
<?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>springcloudalibaba-micro-service-manager</artifactId>
<groupId>com.lzl</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloudalibaba-micro-service-provider-7070</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 注册到Nacos上 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引入公共模块 -->
<dependency>
<groupId>com.lzl</groupId>
<artifactId>springcloudalibaba-micro-service-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
配置yml文件:
spring:
application:
name: provider
cloud:
nacos:
discovery:
register-enabled: true
server-addr: 127.0.0.1:8848
server:
port: 7070
作为服务提供方,需要提供功能方法的具体实现,这里我简化一下,不再编写service层,直接在controller层模拟数据库查询功能
package com.lzl.controller;
import com.lzl.dto.UserDto;
import com.lzl.utils.JsonResult;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
/**
* --效率,是成功的核心关键--
*
* @Author lzl
* @Date 2023/3/15 15:19
*/
@RestController
@RequestMapping("user-provider")
public class UserController {
@RequestMapping("findAll")
public JsonResult findAll(){
//模拟数据库中的数据
List<UserDto> userList = Arrays.asList(
new UserDto(1001, "张三"),
new UserDto(1002, "李四"),
new UserDto(1003, "王五")
);
JsonResult jsonResult = JsonResult.ok();
jsonResult.setData(userList);
return jsonResult;
}
}
创建启动类,开启服务扫描
package com.lzl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* --效率,是成功的核心关键--
*
* @Author lzl
* @Date 2023/3/15 15:20
*/
@SpringBootApplication
@EnableDiscoveryClient//发现服务
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
目录结构如下:
4.创建子工程 springcloudalibaba-micro-service-consumer-8080
在父工程下创建子工程 springcloudalibaba-micro-service-consumer-8080作为服务消费,pom.xml文件如下:
<?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>springcloudalibaba-micro-service-manager</artifactId>
<groupId>com.lzl</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloudalibaba-micro-service-consumer-8080</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 注册到Nacos上 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引入公共模块 -->
<dependency>
<groupId>com.lzl</groupId>
<artifactId>springcloudalibaba-micro-service-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
</dependencies>
</project>
yml配置文件
spring:
application:
name: consumer
cloud:
nacos:
discovery:
register-enabled: true
server-addr: 127.0.0.1:8848
server:
port: 8081
添加配置类WebConfig
package com.lzl.config;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* --效率,是成功的核心关键--
*
* @Author lzl
* @Date 2023/3/15 15:11
*/
@Configuration
public class WebConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
controller
package com.lzl.controller;
import com.lzl.utils.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
/**
* --效率,是成功的核心关键--
*
* @Author lzl
* @Date 2023/3/15 15:12
*/
@RestController
@RequestMapping("user-consumer")
public class UserController {
@Autowired
private RestTemplate restTemplate;//调用服务
@Autowired
private DiscoveryClient discoveryClient;//获取服务参数
//消费方应该调用生产方的服务
@RequestMapping("findAll")
public JsonResult findAll(){
//获取服务提供方的ip,端口
//通过名称去获取
List<ServiceInstance> provider = discoveryClient.getInstances("provider");
//服务提供方对象
ServiceInstance serviceInstance = provider.get(0);
//拿ip
String host = serviceInstance.getHost();
//拿端口
int port = serviceInstance.getPort();
//访问地址
String url = "http://" + host + ":" + port + "/user-provider/findAll";
//调用服务
JsonResult jsonResult = restTemplate.getForObject(url, JsonResult.class);
return jsonResult;
}
}
设置启动类
package com.lzl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* --效率,是成功的核心关键--
*
* @Author lzl
* @Date 2023/3/15 15:16
*/
@SpringBootApplication
@EnableDiscoveryClient//服务扫描注解
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
}
整体的目录结构如下
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和分布式架构的模拟案例,接下来的内容会在下一篇更新
还没有评论,来说两句吧...