springcloud的学习---服务提供者使用集群

    科技2025-11-16  5

    在这里,给我们的服务提供者使用集群,这样的话,当我们的服务提供者就算宕机了,也可以用其他机器给我们的消费者提供服务。 复制一个8001的module项目为8002,基本上都跟8001类似。 先配置pom文件,跟8002文档一致:

    <?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>springcloud</artifactId> <groupId>com.zsp</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-provider-payment8002</artifactId> <dependencies> <!-- 开启eureka的客户端,也就是消费者端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 导入我们分离出去的pojo类--> <dependency> <groupId>com.zsp</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <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> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!--mysql-connector-java--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--jdbc--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>

    第二步去改正下application.yml文件:就改个端口即可

    server: port: 8002 spring: application: name: cloud-payment-service datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/cloud1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 mybatis: mapperLocations: classpath:mapper/*.xml type-aliases-package: com.zsp.springcloud.entities configuration: map-underscore-to-camel-case: true eureka: client: fetch-registry: true #选择true表明自己不是服务注册中心 register-with-eureka: true #选择true表面自己是要注册进eureka注册中心 service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

    第三步,这里为了区分我们使用的是哪个端口的方法,我们在类上写一个字符串serverPort然后给他注入我们的server.port,并且修改下输出方式

    package com.zsp.springcloud.controller; import com.zsp.springcloud.entities.CommonResult; import com.zsp.springcloud.entities.Payment; import com.zsp.springcloud.service.PaymentService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; @RestController @Slf4j @RequestMapping("/payment") public class PaymentController { @Autowired PaymentService paymentService; @Value("${server.port}") private String serverPort; @PostMapping(value = "/create") public CommonResult create(@RequestBody Payment payment){ int result=paymentService.create(payment); log.info("插入的数据是: "+payment); if (result>0) { return new CommonResult(200,"插入数据成功"+serverPort,result); } else { return new CommonResult(444,"插入数据失败",null); } } @GetMapping(value = "/get/{id}") public CommonResult getPaymentById(@PathVariable("id") Long id){ Payment payment=paymentService.getPaymentById(id); log.info("查询到的数据是: "+payment); if (payment!=null) { return new CommonResult(200,"查询成功"+serverPort,payment); } else { return new CommonResult(444,"查询失败",null); } } }

    8001要改的地方很少重复我们的第三步即可。 到这里我们的服务提供者就书写完成了,这里还需要改正下消费者的配置, 因为我们消费者刚开始的服务是写死连接的,所以我们要去改下controller。

    第一步:这里把url从原本的固定的服务提供者地址,改成服务提供者的名字

    package com.zsp.springcloud.controller; import com.zsp.springcloud.entities.CommonResult; import com.zsp.springcloud.entities.Payment; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController @Slf4j public class OrderController { @Autowired RestTemplate template; private static final String url="http://CLOUD-PAYMENT-SERVICE"; @GetMapping("/consumer/payment/create") public CommonResult creat(Payment payment){ return template.postForObject(url+"/payment/create",payment,CommonResult.class); } @GetMapping("/consumer/payment/get/{id}") public CommonResult creat(@PathVariable("id") Long id){ return template.getForObject(url+"/payment/get/"+id,CommonResult.class); } }

    第二步去修改下getRestTemplate在上面加上负载均衡 @LoadBalanced

    package com.zsp.springcloud.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }

    至此我们的服务提供者集群就做完了,这里可以看到我的服务提供者变成了两个。

    连着查询两次发现端口发生变化,出现了轮询

    Processed: 0.011, SQL: 8