SpringCloud(八)Consul的微服务注册

将微服务注册到Consul

1 入门案例

提供一个商品微服务

提供一个订单系统

将微服务注册到Consul

依赖

provider

 <!--SpringCloud提供的对于Consul的服务发现-->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-consul-discovery</artifactId>
         </dependency>
         <!--actuator健康检查-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-actuator</artifactId>
         </dependency>
 
 

orderservice

 <!--SpringCloud提供的对于Consul的服务发现-->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-consul-discovery</artifactId>
 </dependency>
 <!--actuator健康检查-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>

配置

 spring:
  application:
    name: service-product #服务名称
  cloud:
    consul:
      host: 127.0.0.1 #consul服务器的主机地址
      port: 8500 #consul的端口号
      discovery:
         #是否需要注册
        register: true
         #注册的实例ID(唯一标志)
        instance-id: ${spring.application.name}+${random.int}
         #服务的名称
        service-name: ${spring.application.name}
         #服务的请求端口
        port: ${server.port}
         #指定开启IP地址注册
        prefer-ip-address: true
         #当前服务的请求IP
        ip-address: ${spring.cloud.client.ip-address}
 

`

 package com.qqq;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.domain.EntityScan;
 import org.springframework.cloud.client.loadbalancer.LoadBalanced;
 import org.springframework.context.annotation.Bean;
 import org.springframework.web.client.RestTemplate;
 
 @SpringBootApplication
 @EntityScan("com.qqq.entity")
 public class OrderApplication {
     public static void main(String[] args) {
         SpringApplication.run(OrderApplication.class,args);
    }
     /**
      * eureka和consul都集成了Ribbon
      * 使用spring提供的RestTemplate发送http请求到商品服务
      * 1 将RestTemplate对象交给容器管理
      * 2 使用其方法完成操作
      */
     @LoadBalanced //Ribbon自带的负载均衡的注解
     @Bean
     public RestTemplate restTemplate()
    {
         return new RestTemplate();
    }
 
 
 }
 package com.qqq.controller;
 
 import com.qqq.entity.Product;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.client.ServiceInstance;
 import org.springframework.cloud.client.discovery.DiscoveryClient;
 import org.springframework.cloud.client.loadbalancer.LoadBalanced;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.client.RestTemplate;
 
 import java.util.List;
 
 @RestController
 @RequestMapping("/order")
 public class OrderController {
     //注入RestTemplate对象
     @Autowired
     private RestTemplate restTemplate;
     /**
      * 注入DiscoveryClient
      * SpringCloud提供的获取元数据的工具类
      * 调用方法获取服务的元数据信息
      */
     @Autowired
     private DiscoveryClient discoveryClient;
     /**
      * 参数:商品ID
      * 通过订单系统,调用商品服务根据id查询商品信息
      * 1 需要配置一个商品对象
      * 2 需要调用商品服务
      * 使用java中的urlConnection完成,或使用httpClient,okHttp
      * RestTemplate
      */
 //   @RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)
 //   public Product findById(@PathVariable("id") Long id)
 //   {
 //       //调用DiscoveryClient的getInstances方法根据服务名获取元数据
 //       List<ServiceInstance> instances = discoveryClient.getInstances("SERVICE-PRODUCT");
 //       //获取唯一的元数据
 //       ServiceInstance instance = instances.get(0);
 //       Product product=null;
 //       //如何调用商品服务
 //       //根据元数据和端口号拼接请求的url
 //       product=restTemplate.getForObject("http://"+instance.getHost()+":"+instance.getPort()+"/product/"+id,Product.class);
 //       return product;
 //   }
 
     /**
      *
      * 基于Ribbon的形式调用远程微服务
      * @param id
      * @return
      */
     @RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)
     public Product findById(@PathVariable("id") Long id)
    {
         Product product=null;
         product=restTemplate.getForObject("http://service-product/product/"+id,Product.class);
         return product;
    }
 }
posted @ 2020-02-11 00:27  计算机的探索者  阅读(414)  评论(0编辑  收藏  举报