Consul2-使用consul作为服务注册和发现中心

        在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,一起学习交流


猜你喜欢

转载自blog.csdn.net/wj903829182/article/details/80960917