Consul 服务治理(注册中心)

简介: 

  • Consul是由HashiCorp基于Go语言开发的,支持多数据中心,分布式高可用的服务发布和注册服务软件。
  • 用于实现分布式系统的服务发现与配置
  • 使用起来也比较简单。具有天然的可移植性(支持Linux、windows和Mac Os X);安装包仅包含一个可执行文件方便部署。
  • 官网地址:https://www.consul.io

搭建conful 

 

 然后解压,打开后一个exe文件,按住shift按右键,打开powerShell界面,输入下面命令启动。

./consul agent -dev

浏览器访问控制台 localhost:8500

 搭建consumer和producer

 consumer代码:

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/goods/{id}")
    public Goods findGoodsById(@PathVariable("id") int id){
        System.out.println("------------findGoodsById--------"+id);

        //远程调用Goods服务中的findOne接口
        /*
            使用RestTemplate
            1.定义Bean restTemplate
            2.注入Bean
            3.调用方法
        */

        /*
            动态从Eureka Server中获取 provider的ip端口
                1.注入 DiscoveryClient对象  激活
                2.调用方法
        */

        //演示discoveryClient使用
        /**/
        List<ServiceInstance> instances =discoveryClient.getInstances("consul-PROVIDER");

        if (instances == null || instances.size() == 0){
            //集合没有数据
            System.out.println("没有获取到端口和IP");
            return null;
        }

        ServiceInstance instance = instances.get(0);
        String host =instance.getHost();//获取IP
        int port = instance.getPort();//获取端口

        System.out.println("----------host"+host);
        System.out.println("----------port"+port);

        //String url = "http://localhost:8000/goods/findOne/"+id;
        String url = "http://"+host+":"+port+"/goods/findOne/"+id;
        //3.调用方法
        Goods goods = restTemplate.getForObject(url,Goods.class);

        return goods;

    }
}


public class Goods {
    private int id;
    private String title;
    private double price;
    private int count;

    public Goods() {
    }

    public Goods(int id, String title, double price, int count) {
        this.id = id;
        this.title = title;
        this.price = price;
        this.count = count;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", price=" + price +
                ", count=" + count +
                '}';
    }
}


@EnableDiscoveryClient //激活DiscoveryClient   可无
//启动类
@EnableEurekaClient    //可无
@SpringBootApplication
public class ConsumerApp {
    public static void main(String[] args){
        SpringApplication.run(ConsumerApp.class,args);
    }
}



 consumer和provider依赖:

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </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.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
       
    </dependencies>

 consumer配置: 

server:
  port: 9000

spring:
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name} #当前应用注册到consul的名称
        prefer-ip-address: true #注册ip
  application:
    name: consul-consumer

provider配置:

server:
  port: 8000

spring:
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name} #当前应用注册到consul的名称
        prefer-ip-address: true #注册ip
  application:
    name: consul-provider

 provider代码:

//服务提供方
@RestController
@RequestMapping("/goods")
public class GoodsController {
    @Autowired
    private GoodsService goodsService;

    @GetMapping("/findOne/{id}")
    public Goods findOne(@PathVariable("id") int id){
        Goods goods = goodsService.findOne(id);
        return goods;
    }
}

@Repository
public class GoodsDao {
    public Goods findOne(int id){
        return new Goods(1,"华为手机",3999,10000);
    }
}

public class Goods {
    private int id;
    private String title;
    private double price;
    private int count;

    public Goods() {
    }

    public Goods(int id, String title, double price, int count) {
        this.id = id;
        this.title = title;
        this.price = price;
        this.count = count;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", price=" + price +
                ", count=" + count +
                '}';
    }
}


@Service
public class GoodsService {
    @Autowired
    private GoodsDao goodsDao;

    public Goods findOne(int id){
        return goodsDao.findOne(id);
    }

}

//启动类
@EnableEurekaClient
@SpringBootApplication
public class ProviderApp {
    public static void main(String[] args){
        SpringApplication.run(ProviderApp.class,args);
    }
}

运行consumer和provider两个服务互通

 在consul上可以查到两个服务

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值