Consul:一个类似eureka的中间件

260 阅读1分钟

1、下载

这里提供了下载的地址,与相关配置

Consul by HashiCorp

可以到官网下载

2、启动服务

 打开控制台,运行

consul agent -dev

这是正常显示页面

 

3、配置springcloud依赖

父类pom.xml包

  <properties>
        <spring.cloud.version>Hoxton.SR12</spring.cloud.version>
        <spring.boot.version>2.3.12.RELEASE</spring.boot.version>
        <mysql.version>8.0.26</mysql.version>
        <mybatis.version>2.2.0</mybatis.version>
        <druid.version>1.2.3</druid.version>
    </properties>


    <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>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
            
        </dependencies>
    </dependencyManagement>

4、 配置Consul-provider

 实体类:

import java.util.Date;
import java.io.Serializable;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Id;
import javax.persistence.Table;

/**
 * (Movie)实体类
 *
 * @author makejava
 * @since 2021-12-17 09:12:14
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "movie")
public class Movie implements Serializable {
    private static final long serialVersionUID = -30737887108345962L;
    @Id
    private Integer id;

    private String movieName;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date movieData;


}

mapper 使用了tk.mapper


import com.ycz.springCloud.entity.Movie;
import org.apache.ibatis.annotations.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 * (Movie)表数据库访问层
 *
 * @author makejava
 * @since 2021-12-17 09:12:13
 */
@Mapper
public interface MovieMapper extends tk.mybatis.mapper.common.Mapper<Movie>,MySqlMapper<Movie> {


}

service:

/**
 * (Movie)表服务接口
 *
 * @author makejava
 * @since 2021-12-17 09:12:14
 */
public interface MovieService {


    Object getAll();

    Object getOne(Integer id);
}

serviceImpl:

import com.ycz.springCloud.mapper.MovieMapper;
import com.ycz.springCloud.service.MovieService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * (Movie)表服务实现类
 *
 * @author makejava
 * @since 2021-12-17 09:12:15
 */
@Service("movieService")
public class MovieServiceImpl implements MovieService {

    @Autowired
    private MovieMapper movieMapper;


    public Object getAll() {
        return movieMapper.selectAll();
    }

    public Object getOne(Integer id) {
        return movieMapper.selectByPrimaryKey(id);
    }
}

Controller:

import com.ycz.springCloud.service.MovieService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * (Movie)表控制层
 *
 * @author makejava
 * @since 2021-12-17 09:12:12
 */
@RestController
@RequestMapping("movie")
public class MovieController {
    /**
     * 服务对象
     */
    @Autowired
    private MovieService movieService;

    @RequestMapping("getAll")
    public Object getAll(){
       return movieService.getAll();
    }

    @RequestMapping("/getOne/{id}")
    public Object getOne(@PathVariable Integer id){
        return movieService.getOne(id);
    }


}

启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient //开启客户端自动发现,注册到consul中
public class Consul8003 {
    public static void main(String[] args) {
        SpringApplication.run(Consul8003.class,args);
    }
}

配置application.yaml

server:
  port: 8003

spring:
  application:
    name: springcloud-concul-provider-8003
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db05?useUnicode=true
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}



mybatis:
  type-aliases-package: com.ycz.com.ycz.com.ycz.springCloud.entity
  configuration:
    map-underscore-to-camel-case: true
  mapper-locations: classpath:mapper/*.xml

运行:

注册到consul中

 

 正常!!!

5、Consul-consumer配置

pom.xml

    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>tk.mybatis</groupId>
                    <artifactId>mapper-spring-boot-starter</artifactId>

                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
    </dependencies>

ApplicationConfig

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

@Configuration
public class ApplicationConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }


}

 

UserController:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
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;


@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    private static final String REST_URL="http://springcloud-concul-provider-8003";

    @RequestMapping("/getAll")
    public Object getAll(){
        ResponseEntity<Object> forEntity = restTemplate.getForEntity(REST_URL + "/movie/getAll", Object.class);
        return forEntity;
    }

    @RequestMapping("/get/{id}")
    public Object getOne(@PathVariable("id") Integer id){
        ResponseEntity<Object> forEntity = restTemplate.getForEntity(REST_URL + "/movie/getOne/"+id, Object.class);
        return forEntity;
    }


}

启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ConsulConsumer9002 {
    public static void main(String[] args) {
        SpringApplication.run(ConsulConsumer9002.class,args);
    }
}

application.yaml

server:
  port: 9002
spring:
  application:
    name: Consul-Consumer-9002
  cloud:
    consul:
      port: 8500
      host: localhost
      discovery:
        service-name: ${spring.application.name} # 注册到consul注册中心的应用名称

启动的:

 然后访问:

http://localhost:9002/user/getAll

正常:

http://localhost:9002/user/get/1