Spring Cloud Alibaba 消费一个服务-HelloWorld(四)

 
“ 本章节我们写一个spring cloud alibaba 消费服务的一个HelloWorld, 大家可以了解一下基本的consumer,消费者的写法。”
 

 

 
 
01
 
环境检查
 
 
上一章介绍了怎么搭建Spring cloud alibaba运行环境。客官需要确认一下环境是否已经启动。
 
 
如果没有启动的话,用命令启动一下,启动前需要看一下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);
    }
 
}

  

 
这里写了三个方法,分别是:
  1. 最简单的获取用户返回字符串。
  2. 获取用户列表,返回List。
  3. 入参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
 
 
posted @ 2021-04-12 14:08  老包子说架构  阅读(279)  评论(0编辑  收藏  举报