本篇我将手把手教大家创建一个SpringCloudAlibaba项目,并使用Nacos作为注册中心,实现服务消费者调用服务提供者的最简单实例。本案例使用工具如下;
IDE:IntelliJ IDEA 2022.2 (Community Edition社区版)
Nacos:nacos-server-2.1.1【关于Nacos的下载和启动,请参考本篇文章的前一篇】
JDK:Java11
一、创建服务提供者Provider
1、IDEA中【File】->【New】->【Project...】打开如下界面,按照下面的步骤,新建一个简单的Maven项目
2、点击Create时候,弹出一个选择框,这里按照自己的情况选择即可,本文章这里选择一个新窗口
3、删除src目录,因为我们不会在此目录下新建代码,所以删除即可
4、创建cloud-provider模块,操作如下:
这里我把我自己的核心代码和配置贴出来,仅供参考
5、cloud-provider的pom.xml文件
cloud-provider的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>cloud-demo</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-provider</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
在cloud-provider的resources目录下新建一个application.yml文件
application.yml代码如下:
server:
port: 1101
spring:
application:
name: cloud-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #注册中心地址
在provider模块下的Java路径下新建一个包路径
这里我简单以下面路径com.xu.cloud作为演示,输入后点按回车键即可
在新建的包路径下新建一个SpringBoot启动类,如下:
package com.xu.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class CloudProviderApp {
public static void main(String[] args) {
SpringApplication.run(CloudProviderApp.class, args);
}
}
因为是服务提供者,所以还需要提供一个RestController接口对外提供服务,新建一个controller的包路径,然后在该目录下新建一个ProviderController 类文件
package com.xu.cloud.controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProviderController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
二、创建服务提供者Consumer
创建Consumer模块跟上面一样,你也可以复制上面的模块,然后修改新复制的模块的module和directory目录快速创建一个新的模块
然后右键选择项目,选择粘贴,弹出下面的弹窗,修改新模块的名称
修改新复制的pom.xml文件的artifactId改成自己的
然后我们还需要做如下的操作,将我们新复制的模块变成一个maven项目
成功后,IDEA的maven这里应该会正常出现我们新建的项目模块
这里我继续贴出consumer的核心配置和代码
consumer模块的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>cloud-demo</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-consumer</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-cloud-openfeign.version>2.0.0.RELEASE</spring-cloud-openfeign.version>
<spring-cloud-netflix.version>2.0.0.RELEASE</spring-cloud-netflix.version>
</properties>
<dependencies>
<!--nacos发现依赖-->
<dependency>
<groupId>com.alibaba.cloud </groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>${spring-cloud-netflix.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring-cloud-openfeign.version}</version>
</dependency>
</dependencies>
</project>
SpringBoot的启动类也建议改成自己模块的名字,参考代码如下:
package com.xu.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class CloudConsumerApp {
public static void main(String[] args) {
SpringApplication.run(CloudConsumerApp.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
application.yml参考代码如下:
server:
port: 1102
spring:
application:
name: cloud-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #注册中心地址
同样的,我们需要新建一个controller包路径,在该路径下新建一个controller包路径,在该路径下新建一个RestController类,作为消费服务接口去请求服务提供者提供的服务接口
package com.xu.cloud.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/echo2/{str}", method = RequestMethod.GET)
public String echo2(@PathVariable String str) {
return restTemplate.getForObject("http://cloud-provider/echo/" + str,
String.class);
}
}
三、设置父类的pom文件
父级pom的配置很重要,这里包含了SpringCloud和SpringCloudAlibaba依赖包的基本申明,所有子模块是基于父级配置的,参考代码如下:
<?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>org.example</groupId>
<artifactId>cloud-demo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>cloud-provider</module>
<module>cloud-consumer</module>
</modules>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--SpringBoot-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<!--SpringCloud-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
四、启动Nacos验证项目
关于Nacos的安装、配置和启动请参考上一篇文章,这里不再说明
1、启动Nacos后,访问控制台这里的地址http://192.168.31.200:8848/nacos/index.html
,登录界面的账号和密码都是nacos
2、启动provider模块和consumer模块,启动之前最好先用Maven刷新一下项目的依赖包
3、启动CloudProviderApp
看到如下情况,说明provider模块启动成功了
4、启动CloudConsumerApp
看到如下情况,就说明consumer模块就启动成功了
6、在Nacos页面刷新页面,找到【服务列表】,可以看到我们启动的两个服务都已经注册到注册中心了
7、最后我们在浏览器中输入:localhost:1102/echo2/我是你爸爸,可以看到consumer已经成功请求到了provider模块的提供服务
限于篇幅原因,以上所有代码均没有做详细的说明和解释,本篇旨在让读者先感受一下SpringCloudAlibaba项目的基本搭建流程和代码,后续我们将会详细讲解各个组件,感谢大家,我们下回再见。