springcloud项目搭建
引入依赖
-
引入springcloud的版本管理
<!--springcloud的版本控制,不会依赖进来--> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
-
配置中心nacos的依赖引进
<!--配置中心nacos的依赖引进--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.1.0.RELEASE</version> </dependency>
-
安装nacos
自行安装,如果不会可以参考博主准备的相关安装教程:nacos安装教程。操作步骤一:新增命名空间
操作步骤二:新增配置文件
-
新增配置文件
bootstrap.properties
注:该文件会在所有配置文件加载之前加载,加载优先级高
spring.application.name=study spring.cloud.nacos.config.server-addr=120.92.151.118:8848 spring.cloud.nacos.config.namespace=fbbf640d-3387-438e-a5d9-7d39668dade5 spring.cloud.nacos.discovery.server-addr=120.92.151.118:8848 spring.cloud.nacos.discovery.namespace=fbbf640d-3387-438e-a5d9-7d39668dade5
spring.application.name就是nacos中的Data Id的有效值;
spring.cloud.nacos.config.server-addr为nacos的连接地址;
spring.cloud.nacos.config.namespace为命名空间ID; -
新增初始化代码,获取nacos数据测试
@Value("${spring.datasource.url}") private String jdbc; @PostConstruct public void init() { log.info("jdbc="+jdbc); }
-
启动项目,查看情况;
获取成功; -
引入注册中心依赖
<!--注册中心nacos的依赖引进--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.0.RELEASE</version> </dependency>
-
新增bootstrap文件配置项,前面实际上我们已经加过了,所以完成第六步的依赖引入即可;
-
重新启动项目,查看服务是否注册到服务注册中心;
注册成功;
服务间调用
-
copy项目
操作一:更换包名
操作二:更换mapper文件扫描位置
操作三:更改pom文件里的名称
操作四:更改项目端口号为1002;
操作五:nacos新增study-provider的配置;
-
启动项目,查看运行状况;
微服务调用
-
新增ApiController
List itempackage com.xcc.studyprovider.controller; import com.xcc.studyprovider.model.User; import com.xcc.studyprovider.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api") public class ApiController { @Autowired private UserService userService; @PostMapping("/getUserData") public User getUserData(Integer id) { User userById = userService.getUserById(id); return userById; } }
-
重启项目,检测接口是否有效,检测时将接口请求方式改为get;
-
定义一个http请求的一个bean
@Bean // 注册成http请求的一个bean @LoadBalanced // 在多条机器上启动了服务后,可以任意选一个进行请求 public RestTemplate restTemplate() { return new RestTemplate(); }
-
远程请求study-provider项目api
@Autowired private RestTemplate restTemplate; @Override public User getUserById(Integer id) { return restTemplate.postForEntity("http://study-provider/api/getUserData?id={1}", null, User.class, id).getBody(); }
引入api调用封装包
-
引入依赖
<!--远程调用api封装依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.5.RELEASE</version> </dependency>
-
新增文件userApi
package com.xcc.study.api; import org.springframework.cloud.openfeign.FeignClient; @FeignClient("study-provider") // 设置去远程应用调取接口 public class UserApi { }
> @FeignClient(“study-provider”) // 设置去远程应用调取接口 ------很重要
-
新增调用方法 ,此处调用study-provider项目的方法
-
扫面api的文件,注册成bean;
-
api注入到service并调用api内的接口;
注:即使使用注解的方法,一下的代码块依然不能少,因为注解的本质还是使用这个bean的方法;
@LoadBalanced // 在多条机器上启动了服务后,可以任意选一个进行请求 public RestTemplate restTemplate() { return new RestTemplate(); }
-
重启项目测试
更改api提供者的项目结构
1.更改其项目结构,新建两个文件夹,如下;
接下来把原先的src文件放到study-provider-web层下,再分别为study-provider-web和study-provider-api层都拷贝原先的pom.xml文件即可,后面我们在这个基础上修改就可以了,则结构如下图所示;
-
修改最外层pom.xml文件;
操作一:删除build标签依赖,build下web层下进行即可;
操作二:去掉所有依赖;
操作三:新增子模块,代码如下<modules> <module>study-provider-api</module> <module>study-provider-web</module> </modules>
修改完成后,最外层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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> </parent> <groupId>com.xcc</groupId> <artifactId>study-provider</artifactId> <version>1.0.0-SNAPSHOT</version> <name>study-provider</name> <description>Demo project for Spring Boot</description> <packaging>pom</packaging> <properties> <java.version>1.8</java.version> </properties> <dependencies> </dependencies> <!--springcloud的版本控制,不会依赖进来--> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <modules> <module>study-provider-api</module> <module>study-provider-web</module> </modules> </project>
-
修改web层pom.xml文件;
修改父文件和该文件名,修改完后的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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.xcc</groupId> <artifactId>study-provider</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <artifactId>study-provider-web</artifactId> <version>1.0.0-SNAPSHOT</version> <name>study-provider-web</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!--spring-boot依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> <!--mybatis依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.0</version> </dependency> <!--lombok依赖--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--配置中心nacos的依赖引进--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--注册中心nacos的依赖引进--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.5.RELEASE</version> </dependency> <dependency> <groupId>com.xcc</groupId> <artifactId>study-provider-api</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
修改api层pom.xml文件,修改过程基本相似;
操作一:不需要build;
操作二:不需要数据库依赖和nacos依赖、mybatis依赖等;
操作三:修改父文件名称和该文件名称;
修改完之后内容如下:<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.xcc</groupId> <artifactId>study-provider</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <artifactId>study-provider-api</artifactId> <version>1.0.0-SNAPSHOT</version> <name>study-provider-api</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--远程调用api封装依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.5.RELEASE</version> </dependency> </dependencies> <!--springcloud的版本控制,不会依赖进来--> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
以上操作完成后,关闭idea,重新打开该项目并刷新maven,重启项目;
-
provider新建api文件,加入model文件和api文件,定义提供的pai接口给别人调用;
package com.xcc.studyprovider.api; import com.xcc.studyprovider.api.model.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; @FeignClient("study-provider") // 设置去远程应用调取接口 public interface UserApi { @PostMapping("/api/getUserData") User getUser(@RequestParam("id") Integer id); }
在api层的pom.xml文件中引入依赖;
<!--远程调用api封装依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.5.RELEASE</version> </dependency>
-
重启项目,重启成功后,把项目打包到本地仓库;
如果执行该步骤错误,修正pom.xml文件内容如下;<!--springcloud的版本控制,不会依赖进来--> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
-
操作一:study项目引入api依赖
操作二:api注册成bean;
操作三:service层注入并调用api,由于返回的数据类型是study-provider项目的类型,所以需要转换成本项目的model类型才能返回;package com.xcc.study.service; import com.xcc.study.mapper.UserMapper; import com.xcc.study.model.User; import com.xcc.studyprovider.api.UserApi; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @Component public class UserServiceImpl implements UserService{ @Autowired private UserMapper userMapper; @Autowired private RestTemplate restTemplate; @Autowired private UserApi userApi; @Override public User getUserById(Integer id) { // return userMapper.getUserById(id); // return restTemplate.postForEntity("http://study-provider/api/getUserData?id={1}", null, User.class, id).getBody(); com.xcc.studyprovider.api.model.User user = userApi.getUser(id); User user1 = new User(); user1.setAge(user.getAge()); user1.setName(user.getName()); return user1; } }
8.重启项目并检测
访问成功;
注:项目已上传;
链接:https://pan.baidu.com/s/1NaxN3mpxoOMGI5fxM3ev6w
提取码:fd8y
复制这段内容后打开百度网盘手机App,操作更方便哦