0、说明
版本:版本选择
SpringBoot版本:2.3.2.RELEASE
spring-cloud版本:Hoxton.SR9
spring-cloud-alibaba版本:2.2.6.RELEASE
服务注册与发现:
Nacos
远程调用:
RestTemplate,是Spring中提供的发送http请求的客户端。
1、搭建父工程:shiory-cloud
1、建项目
新建一个maven工程,新建完父工程后,删除src目录,父工程结构
2、改pom.xml文件
在pom.xml文件中锁定SpringBoot、SpringCloud、SpringCloud Alibaba的版本,加入以下内容。dependencyManagement标签是锁定版本,并不是真正的依赖。
<!-- SpringBoot版本--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.2.RELEASE</version> <relativePath/> </parent> <properties> <!--JDK版本--> <java.version>1.8</java.version> <!--字符集编码--> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!--spring-cloud版本--> <spring.cloud-version>Hoxton.SR9</spring.cloud-version> <!--spring-cloud-alibaba版本--> <spring.cloud.alibaba-version>2.2.6.RELEASE</spring.cloud.alibaba-version> </properties> <dependencyManagement> <dependencies> <!--spring-cloud--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring.cloud-version}</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring-cloud-alibaba--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring.cloud.alibaba-version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <repositories> <repository> <id>aliyun</id> <name>aliyun Repository</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
如果SpringBoot版本报错,在pom文件中加入以下内容
<repositories> <repository> <id>spring-snapshots</id> <url>http://repo.spring.io/libs-snapshot</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>http://repo.spring.io/libs-snapshot</url> </pluginRepository> </pluginRepositories>
2、提取公共模块:cloud-common
因为微服务项目中,会有很多服务,所以抽取公共部分建成一个模块Module
1、建Module右键项目--New--Module,选择Maven项目,点击Next,选择父工程,输入模块名称,点击Finish
2、改pom.xml文件添加如下依赖,其中Nacos场景依赖暂时是用于服务的注册与发现使用的,此处不用写版本,因为版本已经在父工程中锁定了
<dependencies> <!--web场景依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--端点监控场景依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--Nacos场景依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>
3、新建application.yml文件
在resources目录下新建application.yml文件,添加公共配置(nacos连接信息,用于服务注册与发现)
spring: cloud: nacos: discovery: server-addr: localhost:8848 # nacos-server的地址 username: nacos # nacos-server用户名 password: nacos # nacos-server密码
4、新建主启动类
在src/main/java中新建一个启动类,添加@EnableDiscoveryClient注解,开启服务注册与发现
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * ===================================================== * 服务公共模块 * @author 汐小旅Shiory * @date 2021/12/5 13:46 * ===================================================== */ @SpringBootApplication @EnableDiscoveryClient // 服务注册与发现 public class CommonApplication { public static void main(String[] args) { SpringApplication.run(CommonApplication.class, args); } }
5、项目结构
3、搭建服务提供者:cloud-demo1
1、建Module
右键项目--New--Module,选择Maven项目,点击Next,选择父工程,输入模块名称,点击Finish
2、改pom.xml文件添加刚才新建的公共模块依赖
<dependencies> <!--公共模块依赖--> <dependency> <groupId>com.shiory</groupId> <artifactId>cloud-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
3、新建application.yml文件
在resources目录下新建application.yml文件,并且添加服务名和端口,每个模块的服务名和端口必须保证唯一
server: port: 7001 # 服务端口号,必须配置,保证唯一 spring: application: name: cloud-demo1 # 服务名称,必须配置,保证唯一
4、新建主启动类
在src/main/java中新建一个启动类,和cloud-common一样,把启动类建在同一级目录一下,比如cloud-common的在com.shiory包下,那这个启动类就建在cloud-demo1的com.shiory包下
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * ===================================================== * 服务提供者 * @author 汐小旅Shiory * @date 2021/12/5 13:55 * ===================================================== */ @SpringBootApplication public class Demo1Application { public static void main(String[] args) { SpringApplication.run(Demo1Application.class, args); } }
5、编写对外暴露的接口
也就是要被远程调用的接口:“/demo1/api/callTest”
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * ===================================================== * 服务提供者:对外暴露的接口 * @author 汐小旅Shiory * @date 2021/12/5 14:31 * ===================================================== */ @RestController @RequestMapping("/demo1/api") public class Demo1ApiController { @GetMapping("/callTest") public String callTest(@RequestParam(name = "serverName") String serverName) { String result = "我是服务提供者,我被服务" + serverName + "调用了!"; return result; } }
6、项目结构
4、 搭建服务消费者:cloud-demo2
1、建Module
右键项目--New--Module,选择Maven项目,点击Next,选择父工程,输入模块名称,点击Finish
2、改pom.xml文件添加刚才新建的公共模块依赖
<dependencies> <dependency> <groupId>com.shiory</groupId> <artifactId>cloud-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
3、新建application.yml文件
在resources目录下新建application.yml文件,并且添加服务名和端口,每个模块的服务名和端口必须保证唯一
server: port: 7002 # 服务端口号,必须配置,保证唯一 spring: application: name: cloud-demo2 # 服务名称,必须配置,保证唯一
4、新建主启动类
在src/main/java中新建一个启动类,不过需要在启动类中注入RestTemplate并开启ribbon(@LoadBalanced注解),和cloud-common一样,把启动类建在同一级目录一下,比如cloud-common的在com.shiory包下,那这个启动类就建在cloud-demo1的com.shiory包下
注入RestTemplate:实现远程调用
开启ribbon:使用服务提供者的服务名称调用时,将服务提供者的名称解析成真正的IP和端口
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; /** * ===================================================== * 服务消费者 * @author 汐小旅Shiory * @date 2021/12/5 14:03 * ===================================================== */ @SpringBootApplication public class Demo2Application { public static void main(String[] args) { SpringApplication.run(Demo2Application.class, args); } /** * 注入RestTemplate:实现远程调用 (由Spring提供) * 开启ribbon:将远程服务的名称解析成真正的IP和端口 */ @Bean // 注入RestTemplate @LoadBalanced // 开启ribbon public RestTemplate restTemplate(){ return new RestTemplate(); } }
5、新建业务类(编写Controller)
编写controller(此处只是简单的新建一个Controller,真正的业务类包含Entity,Dao,Service,Controller)
在搭建服务提供者cloud-demo1时,得到以下消息:
服务名称:cloud-demo1
服务暴露的接口:/demo1/api/callTest
响应返回值类型:String
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; /** * ===================================================== * * @author 汐小旅Shiory * @date 2021/12/5 14:38 * ===================================================== */ @RestController @RequestMapping("/demo2") public class Demo2Controller { @Autowired private RestTemplate restTemplate; @Value("${spring.application.name}") private String serverName; /** * 使用RestTemplate发起请求远程调用 * @return */ @GetMapping("/remoteCall") public Map<String,Object> remoteCall() { // 远程服务名称 String remoteServerName = "cloud-demo1"; // 远程服务接口 String remoteInter = "/demo1/api/callTest?serverName=" + serverName; // 拼接远程服务URL String remoteUrl = "http://" + remoteServerName + remoteInter; // 调用远程接口 String remoteResult = restTemplate.getForObject(remoteUrl, String.class); Map<String, Object> map = new HashMap<>(); map.put("remarks", "我是" + serverName + "服务,正在使用RestTemplate调用!"); map.put("remoteResult", remoteResult); return map; } }
6、项目结构
5、测试
1、启动Nacos,在 《Windows下搭建Nacos服务》一文中提到
2、启动服务提供者cloud-demo1,以及服务消费者cloud-demo2
3、登录nacos,查看服务是否注册到Nacos
4、发起请求(请求cloud-demo2中的接口,cloud-demo2接口中远程调用cloud-demo1中的接口)
http://localhost:7002/demo2/remoteCall
至此,远程调用成功 !
6、小结
1、服务注册与发现(Nacos)
1.1、搭建nacos服务:Windows下搭建Nacos服务
1.2、pom.xml中添加依赖
<!--Nacos场景依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
1.3、application.yml中配置nacos连接信息
spring: cloud: nacos: discovery: server-addr: localhost:8848 # nacos-server的地址 username: nacos # nacos-server用户名 password: nacos # nacos-server密码
1.4、启动类上加注解,开启服务注册与发现
@EnableDiscoveryClient // 服务注册与发现
2、远程调用(openfeign)
2.1、服务提供者
2.1.1、暴露接口
2.2、服务消费者
2.2.1、启动类注入RestTemplate、开启ribbon
2.2.2、注入RestTemplate,发起远程调用