在windows环境下搭建consul,可以参考我的上一篇博客:https://blog.csdn.net/j903829182/article/details/80960802
在这里进行一个小实战,使用consul作为我们的注册和配置中心,并实现RPC调用,利用Feign组件来实现RPC调用。
一:创建一个maven项目作为api
使用IDEA创建一个maven项目,这个项目里面主要作为接口api,接口代码如下:
package com.jack.api;
/**
* create by jack 2018/7/8
*/
public interface Hello {
public String sayHello(String name);
}
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">
<parent>
<artifactId>springcloud4</artifactId>
<groupId>com.jack</groupId>
<version>pom</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>consul-api</artifactId>
<version>1.0.0</version>
</project>
二:服务提供者
1,创建一个springboot项目,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>com.jack</groupId>
<artifactId>consul_study2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>consul_study2</name>
<description>Demo project for Spring Boot</description>
<!--<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!– lookup parent from repository –>
</parent>-->
<parent>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-parent -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Finchley.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-consul-discovery -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<!--feign依赖 配置-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
<!--consul中健康检查需要用到actuator,不添加会check failing-->
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jack</groupId>
<artifactId>consul-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2,配置文件代码如下:
spring:
cloud:
consul:
host: localhost
port: 8500
discovery:
#healthCheckPath: ${management.contextPath}/health
healthCheckPath: /health
healthCheckInterval: 15s
instance-id: consul2
enabled: true
enabled: true
application:
name: consul2
server:
port: 8082
3,接口实现代码:
package com.jack.consul_study2.api;
import com.jack.api.Hello;
import org.springframework.stereotype.Service;
/**
* create by jack 2018/7/8
*/
@Service
public class ChineseHelloImpl implements Hello {
@Override
public String sayHello(String name) {
return "我是中国人,我说汉语,我的名字是:"+name;
}
}
4,开启服务注册和发现
package com.jack.consul_study2;
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
public class ConsulStudy2Application {
public static void main(String[] args) {
SpringApplication.run(ConsulStudy2Application.class, args);
}
}
上面使用的注解时@EnableDiscoveryClient来实现服务注册与发现的
5,编写一个consul健康检查的控制器,不然进行服务调用会不成功,代码如下:
package com.jack.consul_study2.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* create by jack 2018/7/8
*/
@RestController
public class HealthController {
@RequestMapping("/health")
public String health(){
return "health";
}
}
6,服务提供的控制器代码如下:
package com.jack.consul_study2.controller;
import com.jack.api.Hello;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* create by jack 2018/7/8
*/
@RestController
@RequestMapping("/hello")
public class HelloController {
@Autowired
private Hello hello;
@RequestMapping("/say")
public String sayHello(String name){
return hello.sayHello(name);
}
}
到这里,服务提供者的基本代码就完成了,下面进行服务消费,即服务调用的开发
三:服务调用
1,创建另外一个springboot项目,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>com.jack</groupId>
<artifactId>consul_study1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>consul_study1</name>
<description>Demo project for Spring Boot</description>
<!--<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!– lookup parent from repository –>
</parent>-->
<parent>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-parent -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Finchley.RELEASE</version>
<relativePath/>
</parent>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-config -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-consul-discovery -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<!--<version>2.0.0.RELEASE</version>-->
</dependency>
<!--feign依赖 配置-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.jack</groupId>
<artifactId>consul-api</artifactId>
<version>1.0.0</version>
</dependency>
<!--consul中健康检查需要用到actuator,不添加会check failing-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2,启动主类的代码如下:
package com.jack.consul_study1;
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
public class ConsulStudy1Application {
public static void main(String[] args) {
SpringApplication.run(ConsulStudy1Application.class, args);
}
}
主要是使用了两个注解:
@EnableDiscoveryClient:服务注册与发现
@EnableFeignClients:开启Feign调用的功能
3,配置文件如下:
spring:
cloud:
consul:
host: localhost
port: 8500
discovery:
#healthCheckPath: ${management.contextPath}/health
healthCheckPath: /health
healthCheckInterval: 15s
instance-id: consul1
enabled: true
enabled: true
application:
name: consul1
server:
port: 8081
4,远程调用的接口如下:
package com.jack.consul_study1.api;
import com.jack.api.Hello;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* create by jack 2018/7/8
*/
@FeignClient("consul2")
public interface Chinese extends Hello {
@RequestMapping(value = "/hello/say")
@Override
String sayHello(String name);
}
5,健康检查的控制器代码如下:
package com.jack.consul_study1.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* create by jack 2018/7/8
*/
@RestController
public class HealthController {
@RequestMapping("/health")
public String health(){
return "health";
}
}
6,测试的控制器代码如下:
package com.jack.consul_study1.controller;
import com.jack.consul_study1.api.Chinese;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* create by jack 2018/7/8
*/
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private Chinese chinese;
@RequestMapping("/hello")
public String testHello(String name){
return chinese.sayHello(name);
}
}
到此,代码基本已经开放完成了,下面进行测试
四,测试
1,启动两个springboot项目,在consul的界面显示如下:
2,测试接口
在postman输入:http://localhost:8081/test/hello?name=jack
输出如下:
源代码地址:
https://github.com/wj903829182/springcloud5/tree/master/consulapi
https://github.com/wj903829182/springcloud5/tree/master/consul_study2
https://github.com/wj903829182/springcloud5/tree/master/consul_study1
总结:
1,consul的健康检查还有点疑问,网上找资料也是说可以自定义一个控制器路径来完成健康检查,但是理论上,觉得应该不需要,还需深入的研究。
2,这里基本实现了consul作为服务的注册与发现,但是是在windows的单机下进行的,没有做consul集群,consul集群和在linux下安装consul另外分享。
3,consul还可以用来作为配置中心,相当于springcloud的config,后续也会进行分享
欢迎加群:331227121,一起学习交流