返回顶部

springCloud入门,版本说明,单机Eureka服务注册与发现

篇幅过长,只有部分代码,记录学习过程和解决的问题。最终会上传码云,供大家下载学习,共勉。

1、SpringCloud是什么


2、SpringCloud与SpringBoot关系

3、SpringCloud与Dubbo的区别

4、Spring Boot和Spring Cloud的版本选择

  • Spring Boot版本使用数字表示,Spring Cloud版本使用字母表示,版本对应官网有说明。

  • Spring Boot强烈建议升级到2.0及以上

  • Spring Cloud版本说明

  • 本次学习技术版本

5、Cloud升级之后

  • 红叉代表停更,但仍然可以使用,推荐使用✔。
  • 官网和中文资料


6、从头开始,始于足下

约定>配置>编码

创建module——引入依赖pom——配置yml——主启动类——业务编码

  • 创建父工程,只做版本声明,并不引入依赖,依赖爆红说明本地仓库没有,子模块会自动下载的。
<!-- 统一管理jar包版本 版本不一定可以改啊-->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <junit.version>4.12</junit.version>
    <log4j.version>1.2.17</log4j.version>
    <lombok.version>1.16.18</lombok.version>
    <mysql.version>5.1.47</mysql.version>
    <druid.version>1.1.10</druid.version>
    <mybatis.spring.boot.version>1.3.1</mybatis.spring.boot.version>
  </properties>

  <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
  <dependencyManagement>
    <dependencies>
      <!--spring boot 2.2.2-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.2.2.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--spring cloud Hoxton.SR1-->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Hoxton.SR1</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--spring cloud alibaba 2.1.0.RELEASE-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2.1.0.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
      </dependency>
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid.version}</version>
      </dependency>
      <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>${mybatis.spring.boot.version}</version>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
      </dependency>
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
      </dependency>
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>

        <optional>true</optional>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <fork>true</fork>
          <addResources>true</addResources>
        </configuration>
      </plugin>
    </plugins>
  </build>

7、创建子模块cloud-provide-payment8081

<dependencies>
        <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--mysql-connector-java-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  • 配置文件
server:
  port: 8081

spring:
  application:
    name: cloud-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource  #数据源类型
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql://localhost:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 123123

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: cn.demo.springcloud.entities  #别名类所在包
  • 启动类略

  • dao层

    • @Param是MyBatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应。public Payment findById(@Param("id") Integer id);
    • useGeneratedKeys="true" keyProperty="id":设置使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中
  • service层

    • @Resource:引入实体对象。
  • controller层

    • 返回数据包装类 CommonResult。
    • POST请求必须加注解@RequestBody
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class CommonResult<T> {
        //返回给前端的结果类
        private Integer code;
        private String message;
        private T      data;
    
        public CommonResult(Integer code,String message){
            this(code,message,null);
        }
    }
    

8、创建子模块cloud-consumer-order80

  • 浏览器访问此模块,再通过 RestTemplate 请求调用 Payment8081 接口,所以只有 controller 层。
@Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

9、公共接口子模块cloud-api-commons

  • 把其他模块共有的东西放在此模块中。clear——》install

10、Eureka注册中心

  • springCloud推荐使用 Eureka,但是已经停更,还是可以使用。那为什么使用注册中心?,由上面代码可以看到,消费者调用服务时使用 "http://localhost:8081" 调用服务,如果服务端改变端口号或者 IP,那么消费端也必须修改。所以不能硬编码,可以将服务注册到 Eureka,通过 Eureka 动态找到需要的服务。
  • Eureka Server
//依赖
<!--eureka-server-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

//application.yml配置
server:
  port: 7001

#Eureka配置
eureka:
  instance:
    hostname: localhost #服务端名称
  client:
    register-with-eureka: false #是否向 eureka 注册
    fetch-registry: false #是否向 eureka 获取信息
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

//启动类的注解
@SpringBootApplication
@EnableEurekaServer
  • Eureka Client就是之前的 payment 和 order 服务
//依赖
<!--eureka-client-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

//payment 提供方 application.yml配置
#Eureka配置,注册服务
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/

//启动类注解
@SpringBootApplication
@EnableEurekaClient

//order 消费方 application.yml配置
#eureka配置
eureka:
  client:
    register-with-eureka: false #不向eureka注册
    service-url:
     defaultZone: http://localhost:7001/eureka/

//消费方使用**服务名**调用服务
    //eureka 通过服务名访问
    private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDE";

    @RequestMapping("/consumer/dept/add")
    public boolean add(Dept dept){
        System.out.println(dept);
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
    }
  • 服务发现
//启动类注解
@EnableDiscoveryClient

//服务发现
    @Resource
    private DiscoveryClient discoveryClient;

@GetMapping("/payment/discovery")
    public Object discovery(){
        //得到服务列表
        List<String> services = discoveryClient.getServices();
        for (String element : services){
            log.info("*****element:"+element);
        }

        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance : instances){
            log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
        }
        return this.discoveryClient;
    }
posted @ 2021-08-23 15:45  凑数的园丁  阅读(178)  评论(0编辑  收藏  举报