SpringCloud详解01
接着上篇的详解01继续
因为最新版的某些组件已经不再更新了,此次案例使用的版本是
Spring Boot Version: 2.3.2.RELEASE
Spring Cloud Version:Spring Cloud Hoxton.SR9
Spring Cloud Alibaba Version:2.2.6.RELEASE
接下来,创建分布式模拟案例,我会在一个父工程下创建三个子工程,充当三个服务
使用IDEA创建一个maven项目,命名为:springcloudalibaba-micro-service-manager,然后导入以下依赖:
pom org.springframework.boot spring-boot-starter-parent 2.3.2.RELEASE com.alibaba.cloud spring-cloud-alibaba-dependencies 2.2.6.RELEASE pom import org.springframework.cloud spring-cloud-dependencies Spring Cloud Hoxton.SR9
需要注意的是,要修改父工程的打包方式为pom,并且父工程不要留src文件目录,只留一个pom.xml文件即可,第二个依赖会爆红,不过无所谓,不影响代码运行
整体文件内容如下:
4.0.0 com.lzl springcloudalibaba-micro-service-manager 1.0-SNAPSHOT springcloudalibaba-micro-service-commons springcloudalibaba-micro-service-provider-7070 springcloudalibaba-micro-service-consumer-8080 pom org.springframework.boot spring-boot-starter-parent 2.3.2.RELEASE com.alibaba.cloud spring-cloud-alibaba-dependencies 2.2.6.RELEASE pom import org.springframework.cloud spring-cloud-dependencies Spring Cloud Hoxton.SR9
在父工程下创建maven子工程springcloudalibaba-micro-service-commons,pom.xml文件如下:
springcloudalibaba-micro-service-manager com.lzl 1.0-SNAPSHOT 4.0.0 springcloudalibaba-micro-service-commons org.projectlombok lombok 1.18.24
这个子工程用来充当基本服务组件的提供,所以我们在该工程下创建实体类和工具类,并填入相关内容,此处我初始化一个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 {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;}}
目录如下:
在父工程下创建子工程springcloudalibaba-micro-service-provider-7070,pom.xml文件如下:
springcloudalibaba-micro-service-manager com.lzl 1.0-SNAPSHOT 4.0.0 springcloudalibaba-micro-service-provider-7070 org.springframework.boot spring-boot-starter-web com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.lzl springcloudalibaba-micro-service-commons 1.0-SNAPSHOT
配置yml文件:
spring:application:name: providercloud:nacos:discovery:register-enabled: trueserver-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 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);}
}
目录结构如下:
在父工程下创建子工程 springcloudalibaba-micro-service-consumer-8080作为服务消费,pom.xml文件如下:
springcloudalibaba-micro-service-manager com.lzl 1.0-SNAPSHOT 4.0.0 springcloudalibaba-micro-service-consumer-8080 org.springframework.boot spring-boot-starter-web com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.lzl springcloudalibaba-micro-service-commons 1.0-SNAPSHOT org.springframework.cloud spring-cloud-starter-openfeign 2.2.6.RELEASE
yml配置文件
spring:application:name: consumercloud:nacos:discovery:register-enabled: trueserver-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 {@Beanpublic 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 {@Autowiredprivate RestTemplate restTemplate;//调用服务@Autowiredprivate DiscoveryClient discoveryClient;//获取服务参数//消费方应该调用生产方的服务@RequestMapping("findAll")public JsonResult findAll(){//获取服务提供方的ip,端口//通过名称去获取List provider = discoveryClient.getInstances("provider");//服务提供方对象ServiceInstance serviceInstance = provider.get(0);//拿ipString 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和分布式架构的模拟案例,接下来的内容会在下一篇更新
上一篇:5728系统刷机步骤