将微服务注册到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; } }
原文地址:https://www.cnblogs.com/qyx66/p/12293590.html
时间: 2024-08-30 10:05:16