本项目只是服务注册和发现中心的一个模块,完整项目整合请参考:https://blog.csdn.net/u012946310/article/details/81913874
一,项目结构与代码展示:
本项目为最后一个模块,服务消费者,下面直接上代码:
1,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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>springcloud_consume6210</groupId>
<artifactId>springcloud_consume6210</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springcloud_consume6210</name>
<description>Demo project for Spring Boot</description>
<parent>
<artifactId>springcloud_demo</artifactId>
<groupId>springcloud_demo</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>springcloud_demo</groupId>
<artifactId>springcloud_model</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 整合swagger,方便接口查看 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>6210</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2,ConsumeApplication6210 服务启动类:
package springcloud.consume;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.web.client.RestTemplate;
@EnableEurekaClient // 本服务启动后会自动注册进eureka服务中
@EnableDiscoveryClient // 让服务使用eureka服务器, 实现服务注册和发现
@SpringBootApplication
public class ConsumeApplication6210 {
public static void main(String[] args) {
SpringApplication.run(ConsumeApplication6210.class, args);
}
//@Bean 应用在方法上,用来将方法返回值设为bean
@Bean
@LoadBalanced //@LoadBalanced实现负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
// 设置@Value注解取值不到忽略(不报错)
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();
c.setIgnoreUnresolvablePlaceholders(true);
return c;
}
}
3,MySwagger2Config swagger 工具类:
package springcloud.consume.swagger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2 // 开启swagger
public class MySwagger2Config extends WebMvcConfigurerAdapter {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo()).select()
// 扫描指定包中的swagger注解
.apis(RequestHandlerSelectors.basePackage("springcloud.consume.controller"))
.paths(PathSelectors.any())
.build()
.pathMapping("/");
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("基础平台 RESTful APIs")
.description("基础平台 RESTful 风格的接口文档,内容详细,极大的减少了前后端的沟通成本,同时确保代码与文档保持高度一致,极大的减少维护文档的时间。")
.version("1.0.0")
.build();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
4,ConsumeController 消费者控制层:
package springcloud.consume.controller;
import cn.hutool.core.bean.BeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import springcloud.service.model.User;
import java.util.Map;
/**
* 消费端接口,像 eureka 请求需要的服务
*/
@RestController
@Slf4j
@RefreshScope
@RequestMapping("/consume")
public class ConsumeController {
@Autowired
private RestTemplate restTemplate;
/**
* 调用服务提供者接口名称,此接口会调用到 eureka.client.serviceUrl.defaultZone 配置的 http://192.168.2.126:6110/eureka/,http://192.168.2.131:6111/eureka/
* 注册中心上面注册的 SPRINGCLOUD-SERVICE 服务提供者上面
*/
private String eurekaService = "http://SPRINGCLOUD-SERVICE";
@Value("${source}")
private String source;
@Value("${name}")
private String name;
@ResponseBody
@PostMapping("/addUser")
public int addUser(User user){
log.info("===============${name}=" + name);
log.info("===============${source}=" + source);
log.debug("===============addUser");
Map map = BeanUtil.beanToMap(user);
int i = restTemplate.postForObject(eurekaService + "/user/addUser/", map, Integer.class);
return i;
}
@ResponseBody
@GetMapping("/getUserById/{userId}")
public User getUserById(@PathVariable("userId") Integer userId){
log.info("===============${name}=" + name);
log.info("===============${source}=" + source);
log.debug("===============addUser");
User user = restTemplate.getForObject(eurekaService + "/user/getUserById/" + userId, User.class);
return user;
}
}
5,application.properties 配置文件:
server.port=6210
#应用(服务)名称
#spring.application.name=springcloud_consume6210 // 不可以使用下划线,改为中划线
spring.application.name=springcloud-consume6210
#注册中心地址
eureka.client.serviceUrl.defaultZone=http://192.168.2.126:6110/eureka/,http://192.168.2.131:6111/eureka/
#自定义服务名称信息
eureka.instance.instance-id=springcloud-consume6210
#访问路径可以显示IP地址
eureka.instance.prefer-ip-address=true
#点击status状态栏时,跳转的路径
eureka.instance.status-page-url=http://localhost:6210/swagger-ui.html
6,bootstrap.properties 配置文件:
#获取远程配置
spring.cloud.config.uri=http://192.168.2.126:6310
spring.cloud.config.profile=test
注意:bootstrap.properties ,它和application.properties 文件一样,会被spring boot加载,但是bootstrap.properties 会优先加载。
这里 bootstrap.properties 文件中配置了分布式配置中心的 ip 地址和运行环境 profile,可以直接获取到分布式配置中心配置的内容,上面 UserController 里面的代码
@Value("${source}")
private String source;
@Value("${name}")
private String name;
就是获取的分布式配置中心的配置信息,仔细查看 application.properties 配置文件里面是没有配置这两个参数的。
二,启动项目并运行展示
上面的服务消费者环境搭建好后就可以运行我们的服务消费者了,消费者运行之前还需要先运行我们之前搭建的126:6110 与 131:6111 两个 eureka 注册中心和 springcloud_service6010 和 6011 两个服务提供者。
运行完服务消费者后,再次刷新 eureka 界面展示控制台
会发现我们的两个服务提供者(126:6110 与 131:6111 )和消费者(6210)分别已经注册到了 两个 eureka 注册中心,服务名称 Application 就是我们代码中 spring.application.name 所配置的服务名称,我们通过该名称来调用服务提供者。
#应用(服务)名称,如果多个服务集群,该名称应该一样
#spring.application.name=springcloud_service // 不可以使用下划线,改为中划线
spring.application.name=springcloud-service
服务提供者同样集成了 swagger 工具,现在我们点击链接跳转到 swagger 接口展示界面来调用服务提供者
通过此图可以发现,我们的服务消费者调用服务提供者已经成功,并且已经成功返回了查询的数据。
备注:由于我们在启动类中配置了 @LoadBalanced 注解
//@Bean 应用在方法上,用来将方法返回值设为bean
@Bean
@LoadBalanced //@LoadBalanced实现负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
所以会开启负债均衡策略,默认是轮询,会在我们配置的两台服务提供者中轮询来调用。
到这里,消费者模块就算完成了。