Spring Cloud Alibaba 消费一个服务-HelloWorld(四)
“ 本章节我们写一个spring cloud alibaba 消费服务的一个HelloWorld, 大家可以了解一下基本的consumer,消费者的写法。”
01
—
环境检查
上一章介绍了怎么搭建Spring cloud alibaba运行环境。客官需要确认一下环境是否已经启动。
Nacos: http://localhost:8848/nacos/
如果没有启动的话,用命令启动一下,启动前需要看一下Mysql是否正常启动了:
➜ docker docker-compose up -d nacos mysql is up-to-date Creating nacos ... done
再看一下上一章写得provider服务是否正常启动注册。
如果没有的话,大家去看一下上一章内容。
02
—
SpringBoot Consumer搭建
废话不多说,还是先上项目结构,也是一个基本的springboot 项目结构:
看一下springcloud-consumer项目结构:
UserConsumerController是Controller类。
SpringCloudProviderService是spring cloud的feign,用于调用provider的服务。
UserDto是模型类。
先是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> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.laobaozi</groupId> <artifactId>springcloud-consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <description>Demo project for alibaba springcloud</description> <properties> <java.version>1.8</java.version> <spring-boot.version>2.3.4.RELEASE</spring-boot.version> <springcloud-alibaba.version>0.9.0.RELEASE</springcloud-alibaba.version> <mybatis-plus.version>3.1.1</mybatis-plus.version> <mysql.version>5.1.47</mysql.version> <encoding>UTF-8</encoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!--database--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${springcloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!--Spring Boot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!--Spring Cloud Alibaba--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.5.RELEASE</version> </dependency> <!-- spring cloud alibaba end--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
依赖非常清晰,除springboot和数据库外,多了两个和spring cloud alibaba相关的依赖,已经做了标识。
其次:Application.yml
server: port: 8012 spring: application: name: springcloud-consumer-demo cloud: nacos: discovery: server-addr: 127.0.0.1:8848/
这里需要注意一下,有的时候因为docker配置的问题没办法用127.0.0.1访问,这个时候可以改成局域网IP。
启动类:SpringcloudConsumerApplication.java
package com.laobaozi.consumer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients(basePackages = "com.laobaozi.consumer.iface") public class SpringcloudConsumerApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudConsumerApplication.class, args); } }
@EnableFeignClients(basePackages = "com.laobaozi.consumer.iface”)
这块定义的是Feign的扫描包,这句代码的表示在iface包下面的feign才会被加载。
Controller: package com.laobaozi.consumer.controller; import com.laobaozi.consumer.iface.SpringCloudProviderService; import com.laobaozi.consumer.model.UserDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class UserConsumerController { @Autowired SpringCloudProviderService springCloudProviderService; @RequestMapping("/user/getUserName") public String listUsersName() { return springCloudProviderService.getUserName(); } @RequestMapping("/user/list") public List<UserDto> listUsers() { return springCloudProviderService.listUsers(); } @RequestMapping("/user/addUser") public String addUser(@RequestBody UserDto userDto) { return springCloudProviderService.addUser(userDto); } }
这里写了三个方法,分别是:
- 最简单的获取用户返回字符串。
- 获取用户列表,返回List。
- 入参UserDto模型,返回字符串。
分别代表了我们在项目中常用的读、写操作。
Fegin Service:
package com.laobaozi.consumer.iface; import com.laobaozi.consumer.model.UserDto; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @FeignClient(name = "springcloud-provicer-demo") public interface SpringCloudProviderService { @PostMapping("/user/getUserName") public String getUserName(); @PostMapping("/user/list") public List<UserDto> listUsers(); @PostMapping("/user/addUser") public String addUser(@RequestBody UserDto userDto); }
这里写一个Feign, 里面定义了三个方法,对应的是controller的三个方法。
@FeignClient(name = "springcloud-provicer-demo”)其中注解表示我们要调用哪个服务,这个和provider服务名要保持一致。
这里我们新增了一个addUser方法,在上一章中并没有写,我们回到springcloud-provider项目重写一下这个方法:
在provider项目中的UserController中加入如下代码:
@RequestMapping("/user/addUser") public String addUser(@RequestBody UserDto userDto) { return userDto.getName()+" add success "; }
Dto:
public class UserDto { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
启动项目:
显示8012端口项目启动成功。
03
—
检查Nacos注册器
在Nacos系统中的服务列表里面除了provider外,还多了一个springcloud-consumer-demo就是我们定义的消费者。
我们再来运行一下我们定义的接口。
试着访问一下定义的两个接口:
接口1 list user:
接口2 Get user:
接口4 Add user:
因为是POST请求,我这里用得是POSTMAN.
当然也可以用curl
➜ docker curl -H "Content-Type:application/json" -X POST --data '{"name": "jim", "age": 36}' http://127.0.0.1:8012/user/addUser jim add success%
在以上的请求中,consumer并没有写相关的数据处理逻辑,启动后跑下来的结果和我们在provider中写的逻辑一致说明我们consumer已经通过nacos调用到了provider的请求。
至此消费者服务消费了我们之前提供的增加用户,获取用户的基本功能,本期的springcloud alibaba服务消费就到这里。
下期我们来讲怎么使用sentinel限流熔断功能。
以上项目源码放到github中,大家可以去下载:https://github.com/Jim201314/springcloud-alibaba