一、启动consul server
在安装好consul的ubuntu虚拟机上启动consul server,以server方式启动:
consul agent -ui -server -data-dir=/tmp/consul -bootstrap-expect 1 -bind 10.211.55.10

使用-ui参数启动server成功后,可以在浏览器中输入:http://localhost:8500/ui 看到如下界面
二、启动consul client
在本机上启动consul client
consul agent -data-dir /tmp/consul -node=yyh -advertise=192.168.31.188 -join=10.211.55.10
加入server节点成功后的截图如下
![]()
一、SpringCloud利用Consul实现服务注册与发现
此时在web ui中查看节点,会发现多了一个节点,但是没有任何服务
如何使用Spring Cloud注册一个服务呢?下面正式开始
三、注册一个service提供服务
1、创建maven项目consulservice1,引入最新的Spring cloud和Spring boot 依赖
<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>
2、创建服务注册程序
@SpringBootApplication
@EnableDiscoveryClient//此注解将自动发现服务并注册服务
@RestController
public class ConsulService1App {
@Value("${spring.application.name}")
private String name;
@Value("${server.port}")
private int port;
@RequestMapping(value = "/hi")
public String hi(){
return "hello world ! I'm :" + name + ":" + port;
}
public static void main(String[] args){
SpringApplication.run(ConsulService1App.class, args);
}
}
application.properties配置,在此处没有进行过于过多的复杂的配置,第二节讲利用consul作为配置中心
spring.application.name=consulservice1
server.port=
启动应用程序,当我们在此打开consul web ui 查看我们的service
只有当健康检查全部通过,service才能被其他服务正常调用,接下来使用postman这个软件在本地调用服务 http://localhost:8001/hi
注意,本例会出现如下情况Could not locate PropertySource: I/O error on GET request 是因为没有配置config server
四、发现服务
1、创建项目consulclient1引入module consulservice1同样的依赖
2、applicant.properties中的配置
spring.application.name=consulclient1
server.port=
#作用是在自动注册服务
spring.cloud.consul.discovery.register=false
3、创建启动应用程序
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.consul.discovery.ConsulDiscoveryClient;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulClient1App implements CommandLineRunner{
@Autowired
private ConsulDiscoveryClient consulDiscoveryClient;
public static void main(String[] args){
SpringApplication.run(ConsulClient1App.class,args);
}
@Override
public void run(String... args) throws Exception {
List<ServiceInstance> serviceInstanceList = consulDiscoveryClient.getInstances("consulservice1");
ServiceInstance serviceInstance = serviceInstanceList.get();
System.out.println("服务地址:" + serviceInstance.getUri());
System.out.println("服务名称:" +serviceInstance.getServiceId());
String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString()+"/hi",String.class);
System.out.println(callServiceResult);
}
}
3、启动应用程序
可以成功的看到发现了我们注册的服务consulservice1,同时使用restTemplate调用了consulservice1的接口。
当我在此打开虚拟机上的web ui,发现并未注册新的服务
五、后续
1、服务是通过serviceId来发现的,注意它和instanceId的区别,serviceId是服务的名称,instanceId是对服务做另外的标注,作用是在多台服务器上部署相同的服务,instanceId一样的话,服务会被覆盖
2、当缺少依赖的时候会出现各种各样奇怪的错误
3、源码地址:https://github.com/NapWells/spring_cloud_learn/tree/master/discover_server_with_consul/springcloudlearn
4、下一篇,以Consul作为Spring Cloud的服务配置中心