spring cloud搭建微服务second-fiberhome(二):结合consul实现服务注册与服务发现

来源:互联网 发布:淘宝店组织架构 编辑:程序博客网 时间:2024/06/08 08:07

spring cloud官方耦合度最好的服务注册于服务发现是eureka。但是在实际应用中,consul服务既能结合spring cloud又能结合其他服务进行服务注册与服务发现,同时功能点强于eureka,对于consul与eureka的优缺点,在此不做介绍。下文使用consul结合spring cloud进行服务注册与服务发现。

consul安装包:consul_0.8.3_windows_amd64.zip系统环境:win7注:本文其他开发环境见上篇,在此略过

1.consul部署

consul既可以单节点使用,也可以进行集群部署,听过算法raft保持集群各节点一致性。在这里只是用consul单节点进行spring cloud的服务注册与服务发现应用。

  1. 解压consul_0.8.3_windows_amd64.zip,得到consul.exe
  2. 将consul.exe拷贝到D:\Program Files\consul(consul文件夹不存在则创建)下,然后在环境变量中配置PATH路径:D:\Program Files\consul
  3. 测试consul是否配置成功
    这里写图片描述
  4. win7启动consul
    打开cmd,输入consul agent -dev
    这里写图片描述
    界面:localhost:8500(consul默认端口为8500)
    这里写图片描述

2.创建second-consul-server-1(2)服务

该工程作为server进行consul的注册server端。

1)在eclipse下创建maven工程second-consul-server-1(2),修改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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent>  <groupId>com.fiberhome</groupId>  <artifactId>second-fiberhome</artifactId>  <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>second-consul-server-1</artifactId> <packaging>jar</packaging> <name>second-consul-server-1</name> <url>http://maven.apache.org</url> <properties>  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies>  <dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-consul-discovery</artifactId>  </dependency> </dependencies> <dependencyManagement>  <dependencies>   <dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-consul-dependencies</artifactId>    <version>1.0.1.RELEASE</version>    <type>pom</type>    <scope>import</scope>   </dependency>  </dependencies> </dependencyManagement></project>

注:对于spring boot服务做健康检查,需要依赖actuator,该依赖在父类工程second-fiberhome中进行了配置,见spring-boot-starter-actuator。

2)在src/main/resources下,创建application.properties。
server.port=9900spring.application.name=consul-serverspring.cloud.consul.host=127.0.0.1spring.cloud.consul.port=8500spring.cloud.consul.discovery.enabled=truespring.cloud.consul.discovery.instance-id=consul-server-1spring.cloud.consul.discovery.hostname=localhostspring.cloud.consul.discovery.port=${server.port}spring.cloud.consul.discovery.serviceName=consul-serverspring.cloud.consul.discovery.healthCheckUrl=http://127.0.0.1:${server.port}/healthspring.cloud.consul.discovery.healthCheckInterval=10sspring.cloud.consul.discovery.tags=dev

注:spring.cloud.consul.discovery.serviceName=consul-server下,可以通过consul服务发现调用consul-server进行访问second-consul-server1(2)服务,需要注意的是类似consul-server使用下划线无效,会转化为“-”,从consul界面可以发现该情况。

3)在src/main/java下创建启动类ConsulServerApplication.java
package com.fiberhome;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication@EnableDiscoveryClientpublic class ConsulServerApplication { public static void main(String[] args) {  SpringApplication.run(ConsulServerApplication.class, args); }}

注:需要在启动类上添加注解@EnableDiscoveryClient

4)启动second-consul-server-1(2)和consul

启动成功后,访问localhost:8500,界面如下:
这里写图片描述

3.创建second-consul-client服务

通过second-consul-client结合consul,进行服务发现访问。

1)创建maven工程second-consul-client,配置consul,并进行访问second-consul-server服务。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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent>  <groupId>com.fiberhome</groupId>  <artifactId>second-fiberhome</artifactId>  <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>second-consul-client</artifactId> <packaging>jar</packaging> <name>second-consul-client</name> <url>http://maven.apache.org</url> <properties>  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies>  <dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-consul-discovery</artifactId>  </dependency> </dependencies> <dependencyManagement>  <dependencies>   <dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-consul-dependencies</artifactId>    <version>1.0.1.RELEASE</version>    <type>pom</type>    <scope>import</scope>   </dependency>  </dependencies> </dependencyManagement></project>

注:主要使用spring-cloud-starter-consul-discovery依赖。

2)创建application.properties配置文件,引入consul配置。
server.port=9990spring.cloud.consul.host=127.0.0.1spring.cloud.consul.port=8500spring.cloud.consul.discovery.instance-id=consul-clientspring.cloud.consul.discovery.hostname=localhostspring.cloud.consul.discovery.serviceName=consul-clientspring.cloud.consul.discovery.healthCheckUrl=http://127.0.0.1:${server.port}/healthspring.cloud.consul.discovery.healthCheckInterval=10sspring.cloud.consul.discovery.tags=devspring.cloud.consul.discovery.enabled=truespring.cloud.consul.discovery.port=${server.port}
3)创建com.fiberhome.web包,新建ClientController.java,引入对consul-server访问。如下:
package com.fiberhome.web;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.RequestMethod;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ClientController { @Autowired public DiscoveryClient discoveryClient; @Autowired public LoadBalancerClient loadBalancer; @RequestMapping(value="/services",method=RequestMethod.GET) public Object services(){  return discoveryClient.getInstances("consul-server"); } @RequestMapping("/discovery") public Object discovery(){  return loadBalancer.choose("consul-server").getUri().toString(); }}

注:spring-cloud-starter-consul-discovery依赖包含了负载均衡和服务发现的类,用以访问consul服务。

package com.fiberhome;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication@EnableDiscoveryClientpublic class ConsulClientApplication { public static void main(String[] args) {  SpringApplication.run(ConsulClientApplication.class, args); }}
4)启动三个服务:
second-consul-server-1second-consul-server-2second-consul-client

然后使用postman访问client服务,localhost:9990/services
这里写图片描述
访问localhost:9990/discovery
这里写图片描述
注意,由于采用的是两个server服务,所以每次请求discovery获取的结果是不同的,默认采用的是轮询方式访问两者服务,具有负载均衡的特点。
这里写图片描述

该工程源码见github:https://github.com/moyu2012/second-fiberhome

阅读全文
0 0
原创粉丝点击