四、Spring Cloud Alibaba项目,测试模块之生产者与消费者

1、模块说明

生产者:service-order

消费者:service-user

说明:消费者user调用生产者order,调用订单服务

 

2、生产者

pom文件

<?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.shiwn</groupId>
        <artifactId>spring-cloud-alibaba</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <groupId>com.shiwn</groupId>
    <artifactId>service-order</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>service-order</name>
    <description>生产者-订单服务</description>

    <dependencies>
        <!-- 公共依赖-->
        <dependency>
            <groupId>com.shiwn</groupId>
            <artifactId>service-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 配置文件

# 应用服务 WEB 访问端口
server.port=8030

# 应用名称(nacos会将应用名称当作服务名称)
spring.application.name=service-order

# nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=192.168.1.206:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

 controller

@RestController
@RequestMapping("/order")
public class OrderController {
    @Value("${server.port}")
    private String port;

    /**
     * 新增订单
     *
     * @return
     */
    @RequestMapping("/add")
    public String add() {
        System.out.println("新增订单成功");
        return "订单服务-新增订单成功 - 端口:" + port;
    }

    /**
     * 取消订单
     *
     * @return
     */
    @RequestMapping("/cancel")
    public String cancel() {
        System.out.println("取消订单成功");
        return "订单服务-取消订单成功 - 端口:" + port;
    }
}

 

3、消费者

pom文件

<?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.shiwn</groupId>
        <artifactId>spring-cloud-alibaba</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <groupId>com.shiwn</groupId>
    <artifactId>service-user</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>service-user</name>
    <description>消费者-用户服务</description>

    <dependencies>
        <!-- 公共依赖-->
        <dependency>
            <groupId>com.shiwn</groupId>
            <artifactId>service-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 配置文件

# 应用服务 WEB 访问端口
server.port=8031

# 应用名称(nacos会将应用名称当作服务名称)
spring.application.name=service-user

# nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=192.168.1.206:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

 controller

@RestController
@RequestMapping("/user")
public class UserController {
    @Value("${server.port}")
    private String port;

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/addOrder")
    public String addOrder() {
        String url = "http://service-order/order/add";
        String apiReqResult = restTemplate.getForObject(url, String.class);
        return "用户服务-新增订单成功:" + apiReqResult;
    }

    @RequestMapping("/cancelOrder")
    public String cancelOrder() {
        String url = "http://service-order/order/cancel";
        String apiReqResult = restTemplate.getForObject(url, String.class);
        return "用户服务-取消订单成功:" + apiReqResult;
    }
}

RestTemplate配置

RestTemplate 是 Spring 对HttpClient 的封装,提供了一系列方便易用的 API。可直接使用微服务名称进行调用

@Configuration
public class RestConfig {
    @Bean
    @LoadBalanced   //开启ribbon
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

 

4、更新父工程pom

    <modules>
        <module>service-nacos</module>
        <module>service-common</module>
        <module>service-order</module>
        <module>service-user</module>
    </modules>

 

5、多生产者

 使用ribbon的负载均衡进行多生产者测试。      

(1)在idea中复制服务

(2)填写参数(二选一)

// 方式一
VM options: -Dserver.port=8040
// 方式二
Program arguments: --server.port=8040

(3)启动服务,查看nacos

(4)调用测试

地址:

  http://ip:8031/user/addOrder

结果:

用户服务-新增订单成功:订单服务-新增订单成功 - 端口:8030
用户服务-新增订单成功:订单服务-新增订单成功 - 端口:8040
用户服务-新增订单成功:订单服务-新增订单成功 - 端口:8030
...
默认使用轮询算法

注:

  第一次调用时,可能会比较慢,因为要初始化ribbon的负载均衡器(懒加载)。

posted @ 2022-08-25 17:51  幻月hah  阅读(113)  评论(0编辑  收藏  举报