springcloud consul
代码必须有包名,比如test。如果没有,运行会报错。
一.下载consul的windows版本consul_1.6.2_windows_amd64.zip
1.解压之后只有一个文件,consul.exe
2.新建文件run.bat,内容如下:
consul agent -dev
pause
默认启动端口号是8500,访问地址:
http://127.0.0.1:8500/ui/dc1/services
二.建立producer工程spring-cloud-consul-producer
pom.xml
<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> <groupId>consul-test</groupId> <artifactId>consul-test</artifactId> <version>0.0.1-SNAPSHOT</version> <name>consul-test</name> <packaging>jar</packaging> <description>consul-test</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> </parent> <dependencyManagement> <dependencies> <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.M8</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <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.springframework.boot</groupId> <artifactId>spring-boot-actuator</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-consul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> </dependencies> </project>
新建文件application.properties
spring.application.name=spring-cloud-consul-producer server.port=8501 #spring.cloud.consul.host=127.0.0.1 #spring.cloud.consul.port=8500 spring.cloud.consul.discovery.serviceName=service-producer
application.yml启动优先级小于bootstrap.yml,会报错:Fetching config from server at : http://localhost:8888
所以需要:新建bootstrap.yml
spring:
cloud:
config:
uri: http://localhost:8500
demo代码:
package test;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "hello consul";
}
}
package test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudConsulProducerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsulProducerApplication.class, args);
}
}
consul健康检查服务请求:http://127.0.0.1:8501/actuator/health
三.建立consumer工程spring-cloud-consul-consumer
pom.xml
<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> <groupId>consul-test</groupId> <artifactId>consul-test</artifactId> <version>0.0.1-SNAPSHOT</version> <name>consul-test</name> <packaging>jar</packaging> <description>consul-test</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> </parent> <dependencyManagement> <dependencies> <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.M8</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <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.springframework.boot</groupId> <artifactId>spring-boot-actuator</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-consul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> </dependencies> </project>
application.properties
spring.application.name=spring-cloud-consul-consumer server.port=8503 #spring.cloud.consul.host=127.0.0.1 #spring.cloud.consul.port=8500 spring.cloud.consul.discovery.register=false
application.yml启动优先级小于bootstrap.yml,会报错:Fetching config from server at : http://localhost:8888
所以需要:新建bootstrap.yml
spring:
cloud:
config:
uri: http://localhost:8500
demo代码:
package test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class CallHelloController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@RequestMapping("/call")
public String call() {
ServiceInstance serviceInstance = loadBalancerClient.choose("service-producer");
System.out.println("服务地址:" + serviceInstance.getUri());
System.out.println("服务名称:" + serviceInstance.getServiceId());
String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello",
String.class);
System.out.println(callServiceResult);
return callServiceResult;
}
}
package test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ServiceController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private DiscoveryClient discoveryClient;
/**
* 获取所有服务
*/
@RequestMapping("/services")
public Object services() {
return discoveryClient.getInstances("service-producer");
}
/**
* 从所有服务中选择一个服务(轮询)
*/
@RequestMapping("/discover")
public Object discover() {
return loadBalancerClient.choose("service-producer").getUri().toString();
}
}
package test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringCloudConsulConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsulConsumerApplication.class, args);
}
}
四.测试
启动SpringCloudConsulProducerApplication和SpringCloudConsulConsumerApplication
http://127.0.0.1:8503/services
http://127.0.0.1:8503/call
浙公网安备 33010602011771号