SpringCloud注册中心Consul及服务调用Feign

/ SpringCloud / 5 条评论 / 2207人围观

官方推荐的是使用Eureka,但Eureka2.x已经停止更新了,而Consul作为它的替代者,功能很强大,内存占有率更小。

Consul的安装

官方网站下载相关的Consul即可,下载地址:https://www.consul.io/downloads.html,这边下载的是Linux系统64位压缩包。

Provider实现

首先创建一个SpringBoot工程,引入相关依赖。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<!-- 健康检查 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<!-- Spring Cloud Consul 的支持 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    <version>1.3.4.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApp {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApp.class, args);
    }

}
spring.application.name=spring-cloud-provider
server.port=8080
spring.cloud.consul.host=xx.xxxx.xxx.xxx
spring.cloud.consul.port=8500
#注册到consul的服务名称
spring.cloud.consul.discovery.serviceName=service-provider-01

启动项目,会发现项目 service-provider-01 注册到了consul中。

Consumer实现

消费者是利用Feign通过注册中心来消费接口的。

<!-- 健康检查 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<!-- Spring Cloud Consul 的支持 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    <version>1.3.4.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
@SpringBootApplication
@EnableFeignClients
public class ConsumerApp {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApp.class, args);
    }

}
spring.application.name=spring-cloud-consumer
server.port=8081
spring.cloud.consul.host=xxx.xxx.xxx.xxx
spring.cloud.consul.port=8500
# 不需要注册到consul中
spring.cloud.consul.discovery.register=false

定义Feign接口

作为Provider服务端,是向外暴露接口的,所以将接口单独抽离出来,作为一个独立的工程模块对外服务,第三方想要使用我们定义的接口,只需添加依赖即可。

@FeignClient(value = "service-provider-01")
public interface IUserService {

    @RequestMapping("/user/1")
    String getUserInfo();

    @RequestMapping("/user/2")
    String getInfo();

}
<!-- 引入feign接口包 -->
<dependency>
    <groupId>com.zhangjianbing</groupId>
    <artifactId>feign_interface</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
@RestController
public class PersonController implements IUserService {

    @Override
    public String getUserInfo() {
        return "Hello,70KG!";
    }

    @Override
    public String getInfo() {
        return "hello 2";
    }

}

这样做的好处是,provider、consumer以及feign做了强关联,三者必须统一,且只能够服务之间调用,并不能通过web端调用。

<dependency>
    <groupId>com.zhangjianbing</groupId>
    <artifactId>feign_interface</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    @RequestMapping("/info")
    public String getUserInfo() {
        String userInfo = userService.getUserInfo();
        return userInfo;
    }

    @RequestMapping("/msg")
    public String getUserMsg() {
        String userInfo = userService.getInfo();
        return userInfo;
    }

}

这样三者之间的关系就完成了,分别启动consul、provider、consumer,然后在浏览器中访问consumer规定的资源路径即可实现远程调用。本工程相关示例代码放在了码云上,地址:https://gitee.com/beijinglogic/spring_cloud_consul_demo

  1. What's your problem?

    回复
  2. 这个和我写的几乎一模一样,我也是居于TALE去写的,但我用的是jfinal,写完我就后悔了,主要是jfinal的路由不太好,写完之后我想着扩展,发现jfinal满足不了我的需求,顿时就没心情继续写了,哎

    回复

    @哈哈haha 测试自己回复自己

    回复

    @哈哈haha 三重回复

    回复

    @哈哈haha 我都不折腾了,哈哈

    回复