SpringCloud之Consul入门案例

下载

consul官网:https://www.consul.io 

项目结构

spring-cloud-parent:主项目

consul-consumer:消费者

consul-provider:生产者

spring-cloud-parent 父工程

<?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.hikktn</groupId>
    <artifactId>spring-cloud-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>eureka-consumer</module>
        <module>eureka-provider</module>
        <module>eureka-server</module>
        <module>eureka-server-1</module>
        <module>eureka-server-2</module>
        <module>consul-consumer</module>
        <module>consul-provider</module>
    </modules>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.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>
        <!--spring cloud 版本-->
        <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
    </properties>
    
    <!--引入Spring Cloud 依赖-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

consul-consumer 子工程

pom

<?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>spring-cloud-parent</artifactId>
        <groupId>com.hikktn</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    
    <artifactId>consul-consumer</artifactId>
    
    <dependencies>
        <!--consul 客户端-->
        <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>
</project>

application.yml

server:
  port: 9000


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

  application:
    name: consul-consumer # 应用名称

 bean

package com.hikktn.entity;

import java.io.Serializable;

/**
 * @ClassName Goods
 * @Description 商品实体类
 * @Author lisonglin
 * @Date 2021/4/12 14:40
 * @Version 1.0
 */
public class Goods implements Serializable {
	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 + '}';
	}
}

配置类

package com.hikktn.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @ClassName RestTemplateConfig
 * @Description TODO
 * @Author lisonglin
 * @Date 2021/4/12 15:24
 * @Version 1.0
 */
@Configuration
public class RestTemplateConfig {

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

控制器

package com.hikktn.controller;

import com.hikktn.entity.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * @ClassName OrderController
 * @Description 服务的消费方
 * @Author lisonglin
 * @Date 2021/4/12 14:51
 * @Version 1.0
 */
@RestController
@RequestMapping("/order")
public class OrderController {
	@Autowired
	private RestTemplate restTemplate;
	@Autowired
	private DiscoveryClient discoveryClient;

	@GetMapping("/goods/{id}")
	public Goods findOne(@PathVariable("id") int id) {

		//
		List<ServiceInstance> instances = discoveryClient.getInstances("consul-provider");
		if (instances == null || instances.size() <= 0) {
			return null;
		}
		ServiceInstance serviceInstance = instances.get(0);
		// 获取ip
		String host = serviceInstance.getHost();
		// 获取端口
		int port = serviceInstance.getPort();
		System.out.println("ip:"+host+",port:"+port);
		String url = "http://" + host + ":" + port + "/goods/findOne/" + id;

		Goods goods = restTemplate.getForObject(url, Goods.class);
		System.out.println(goods);
		return goods;
	}
}

启动类

package com.hikktn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @ClassName ProviderApp
 * @Description TODO
 * @Author lisonglin
 * @Date 2021/4/12 14:37
 * @Version 1.0
 */
@SpringBootApplication
public class ConsumerApp {

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

}

consul-provider 子工程

pom

<?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>spring-cloud-parent</artifactId>
        <groupId>com.hikktn</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    
    <artifactId>consul-provider</artifactId>
    <dependencies>
        
        <!--consul 客户端-->
        <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>

</project>

application.yml

server:
  port: 8000
spring:
  cloud:
    consul:
      host: localhost # consul 服务端的 ip
      port: 8500 # consul 服务端的端口 默认8500
      discovery:
        service-name: ${spring.application.name} # 当前应用注册到consul的名称
        prefer-ip-address: true # 注册ip

  application:
    name: consul-provider # 应用名称

bean

package com.hikktn.entity;

import java.io.Serializable;

/**
 * @ClassName Goods
 * @Description 商品实体类
 * @Author lisonglin
 * @Date 2021/4/12 14:40
 * @Version 1.0
 */
public class Goods implements Serializable {
	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 + '}';
	}
}

dao

package com.hikktn.dao;

import com.hikktn.entity.Goods;
import org.springframework.stereotype.Repository;

/**
 * @ClassName GoodsDao
 * @Description TODO
 * @Author lisonglin
 * @Date 2021/4/12 14:42
 * @Version 1.0
 */
@Repository
public class GoodsDao {

	public Goods findOne(int id){
		// 这里是从数据库中查询得出
		return new Goods(1,"小米手机",1999.0,50);
	}
}

service

package com.hikktn.service;

import com.hikktn.dao.GoodsDao;
import com.hikktn.entity.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @ClassName GoodsService
 * @Description TODO
 * @Author lisonglin
 * @Date 2021/4/12 14:44
 * @Version 1.0
 */
@Service
public class GoodsService {
	@Autowired
	private GoodsDao goodsDao;

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

控制器

package com.hikktn.controller;

import com.hikktn.entity.Goods;
import com.hikktn.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassName GoodsController
 * @Description 服务的提供方
 * @Author lisonglin
 * @Date 2021/4/12 14:45
 * @Version 1.0
 */
@RestController
@RequestMapping("/goods")
public class GoodsController {
	@Autowired
	private GoodsService goodsService;

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

启动类

package com.hikktn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @ClassName ProviderApp
 * @Description TODO
 * @Author lisonglin
 * @Date 2021/4/12 14:37
 * @Version 1.0
 */
@SpringBootApplication
public class ProviderApp {

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

}

测试

shift+右键

在powershell输入命令

./consul agent -dev

 启动服务

访问

以上,完结! 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hikktn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值