2021-08-12 快速学习上手SpringCloud

Eureka服务注册中心

服务客户端(服务提供方)将服务注册进Eureka服务注册中心,消费者向Eureka服务注册中心获取服务。
1.导入依赖(SpringBoot,SpringCloud-Eureka)
pom.xml

<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
 <properties>
  <springcloud.version>1.4.6.RELEASE</springcloud.version>
   <springboot.version>2.1.4.RELEASE</springboot.version>
  </properties>
   <!--导入Eureka Server依赖-->
    <dependencies>
    	<!--Eureka-Server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>${springcloud.version}</version>
        </dependency>
          <!--SpringBoot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${springboot.version}</version>
            </dependency>
 	</dependencies>            

2.配置服务中心
application.yml

server:
  port: 7001
# Eureka配置
eureka:
  instance:
    # Eureka服务端的实例名字
    hostname: 127.0.0.1
  client:
    # 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
    register-with-eureka: false
    # fetch-registry如果为false,则表示自己为注册中心,客户端的化为 ture
    fetch-registry: false
    # Eureka监控页面~
    service-url:
    	#配置其他注册中心,有多个注册中心,地址之间通过,隔开
      defaultZone: http://localhost:7002/eureka/ # 单机:http://${eureka.instance.hostname}:${server.port}/eureka/

3.启动服务
application.java

@SpringBootApplication
//开启Eureka服务注册服务
@EnableEurekaServer
public class EurekaServerApplication7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication7001.class,args);
    }
}

实际效果
在这里插入图片描述

Eureka客户端(服务提供方)

1.导入依赖
pom.xml

<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
 <properties>
  <springcloud.version>1.4.6.RELEASE</springcloud.version>
   <springboot.version>2.1.4.RELEASE</springboot.version>
   </properties>
   <dependencies>
   		<!--Eurkea依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>${springcloud.version}</version>
        </dependency>
          <!--SpringBoot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${springboot.version}</version>
            </dependency>
 	</dependencies>   

2.配置服务

eureka:
  instance:
  #实例名
    instance-id: EurekaProvider8002
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/ # Eureka配置:配置服务注册中心地址

server:
  port: 8002

info:
#http://localhost:8001/actuator/info 可以看到信息,给Eureka服务中心提供信息
  app.name: Dept-8002
spring:
  application:
  	#提供方
    name: EurekaProvider #与instance-id存在一对多。Eureka通过name找服务,Ribbon或者Feign通过负载均衡算法找instance-id


3.开启服务
application.java

package com.apex;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
// @EnableEurekaClient 开启Eureka客户端注解,在服务启动后自动向注册中心注册服务
@EnableEurekaClient
//@MapperScan("com.apex.Mapper")
public class EurekaProviderApplication8002 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaProviderApplication8002.class,args);
    }
}

实际效果
在这里插入图片描述

Ribbon

实现Eureka客户端负载均衡。由于本人习惯接口开发,在这不演示Ribbon的配置方式,转向Feign。

Feign

面向社区,面向接口的Eureka客户端负载均衡。通过特定的算法,实现负载均衡。

1.导入依赖

<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
 <properties>
  <springcloud.version>1.4.6.RELEASE</springcloud.version>
   <springboot.version>2.1.4.RELEASE</springboot.version>
   </properties>
   <!--导入Eureka Server依赖-->
    <dependencies>
     <!--Feign,包含了Hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>${springcloud.version}</version>
        </dependency>
       <!--Feign服务依赖Eureka服务,所以要多导入Eureka-->
      <!--eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
             <version>${springcloud.version}</version>
        </dependency>
          <!--SpringBoot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${springboot.version}</version>
            </dependency>
 	</dependencies>  

2.配置服务

eureka:
  client:
    register-with-eureka: false # 不向 Eureka注册自己
    service-url: # 从两个注册中心中随机取一个去访问
      defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/

spring:
  main:
    # 允许重复服务
    allow-bean-definition-overriding: true #消费完一轮后,从头开始。
server:
  port: 8000

3.启动服务

package com.apex;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
// feign客户端注解,并指定要扫描的包以及配置接口DeptClientService
@EnableFeignClients
public class FeignConsumer80Application {
    public static void main(String[] args) {
        SpringApplication.run(FeignConsumer80Application.class, args);
    }


}

4.调用服务
在Service指定调用的服务接口,以后消费者通过Feign客户端的接口实现获取服务

package com.apex.ServiceImpl;

import com.apex.Bean.Dept;
import com.apex.Bean.JsonObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;


/* @FeignClient:微服务客户端注解,value:指定微服务的名字,这样就可以使Feign客户端直接找到对应的微服务
*/
@FeignClient(value = "EUREKAPROVIDER")
public interface DeptClientService {
	//指定Eureka客户端(服务提供方)的Api接口。即调用服务提供方的接口获取服务
    @GetMapping("/dept/list")
    public JsonObject queryAll();

}

Feign接口Controller层


import com.apex.Bean.Dept;
import com.apex.Bean.JsonObject;
import com.apex.ServiceImpl.DeptClientService;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
@RestController
public class DeptConsumerController {
    @Autowired
    private DeptClientService deptClientService;
    /**
     * 消费方根据id查询部门信息
     * @param
     * @return
     */
    @GetMapping("/consumer/dept/list")
    public JsonObject list() {
        return deptClientService.queryAll();//消费者调用Feign接口,Feign接口调用Service,Service获取服务方接口。最后返回最终的接口
    }

}

实际效果
在这里插入图片描述

Hystrix

服务熔断机制,当某个方法接口无法提供服务时,采用备选方案(可以选择返回接口奔溃的错误信息或者调用其他接口),防止用户在不断请时服务不断请求响应却又无法返回信息,大量占用资源,也影响用户体验)。

Hystrix一般搭配Feign使用或者Ribbon使用,因为消费方现在通过Feign或者Ribbon获取服务。
而且是在Feign中实现Hystrix,而不是服务提供方中实现。

  1. 导入依赖
<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
 <properties>
  <springcloud.version>1.4.6.RELEASE</springcloud.version>
   <springboot.version>2.1.4.RELEASE</springboot.version>
   </properties>
   <!--导入Eureka Server依赖-->
    <dependencies>
     <!--Feign,包含了Hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>${springcloud.version}</version>
        </dependency>
       <!--Feign服务依赖Eureka服务,所以要多导入Eureka-->
      <!--eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
             <version>${springcloud.version}</version>
        </dependency>
          <!--SpringBoot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${springboot.version}</version>
            </dependency>
 	</dependencies>  

2.配置服务

eureka:
  client:
    register-with-eureka: false # 不向 Eureka注册自己
    service-url: # 从两个注册中心中随机取一个去访问
      defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/

spring:
  main:
    # 允许重复服务
    allow-bean-definition-overriding: true #消费完一轮后,从头开始。
server:
  port: 8000

feign:
  hystrix:
    enabled: true #开启服务降级

3.启动服务(这里的启动类只开启了Feign)

package com.apex;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
// feign客户端注解,并指定要扫描的包以及配置接口DeptClientService
@EnableFeignClients
public class FeignConsumer80Application {
    public static void main(String[] args) {
        SpringApplication.run(FeignConsumer80Application.class, args);
    }


}

4.调用服务

Service层实现Hystrix

package com.apex.ServiceImpl;

import com.apex.Bean.Dept;
import com.apex.Bean.JsonObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;


/* @FeignClient:微服务客户端注解,value:指定微服务的名字,这样就可以使Feign客户端直接找到对应的微服务
   fallbackFactory指定服务降级采用的策略
*/
@FeignClient(value = "EUREKAPROVIDER",fallbackFactory = DeptServiceFallBackFactory.class)
public interface DeptClientService {

    @GetMapping("/dept/list")
    public JsonObject queryAll();

}

在Feign服务微服务下编写 DeptServiceFallBackFactory,熔断降级方法。

package com.apex.ServiceImpl;

import com.apex.Bean.CodeAndMsgEnum;
import com.apex.Bean.Dept;
import com.apex.Bean.JsonObject;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

/**
 * 服务降级策略
 *
 * @author ZJX
 * @date 2021/07/21
 */
@Component
public class DeptServiceFallBackFactory implements FallbackFactory<DeptClientService> {
    @Override
    public DeptClientService create(Throwable throwable) {
        return new DeptClientService() {
            @Override
            public String queryAll() {
                return  new JsonObject(null, CodeAndMsgEnum.failed.getCodeAndMsg()); //返回访问失败的错误信息
            }
        };
    }
}

实际效果
把服务提供方shutdown掉。
在这里插入图片描述

Zuul

路由网管,功能类似于Nginx。能够更加简便调用接口,添加接口配置。让用户无法直接获取服务的提供接口,而是通过Zuul获取,能够更加安全。

1.导入依赖

<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
 <properties>
  <springcloud.version>1.4.6.RELEASE</springcloud.version>
   <springboot.version>2.1.4.RELEASE</springboot.version>
   </properties>
    <dependencies>
        <!--SpringBoot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${springboot.version}</version>
        </dependency>
        <!--zuul-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
            <version>${springcloud.version}</version>
        </dependency>
        <!--导入eureka服务依赖是因为要从Eureka中获取服务-->
        <!--eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>${springcloud.version}</version>
        </dependency>
    </dependencies>

2.配置服务

eureka:
  client:
    service-url:
     #配置Eureka服务中心
      defaultZone: http://localhost:7001/eureka
  instance:
  #实例名
    instance-id: ZUULCONSUMER9501


spring:
  application:
    name: ZUULCONSUMER9501
zuul:
  ignored-services: "*"  #忽略所有的微服务名称。//不设置的话可以加微服务名称寻找api
  prefix: /SpringCloud   #所有url的前缀
  routes:
  #即DeptService绑定了EurekaProvider服务,将此服务的地址绑定成/DeptService/** 其对应下的接口
  #结合本文的项目配置,即访问 http://localhost:9501/SpringCloud/DeptService/dept/list,其中、dept/list是Controller下的接口
    DeptService.serviceId: EurekaProvider #绑定微服务的服务名,map的形式绑定。前面是key,后面是value
    DeptService.path: /DeptService/**     #根据key->value的对应关系绑定路径,即通过/DeptService/**访问EurekaProvider服务
server:
  port: 9501

3.开启服务


package com.apex;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
//启动Zuul路由
@EnableZuulProxy
public class ZuulConsumer9501Application {
    public static void main(String[] args) {
        SpringApplication.run(ZuulConsumer9501Application.class,args);
    }
}

实际效果
在这里插入图片描述

Config服务端

SpringCloud-Config,可以将yml配置文件放在git仓库中,将配置文件和项目分开,因为是分布式应用,当修改某个应用的配置的时候,就不需要到该应用中去修改相关的配置,并且修改之后还有重启应用,相对来说很麻烦。当迁移仓库的位置时,只需要修改server中的配置即可,Client中无需进行任何修改。
并且spring cloud config还支持热更新,当你修改了配置文件中的配置,通过post: http://hostname:port/actuator/refresh 到server 应用操作,可以实现配置热更新,当Client中的类使用了@RefreshScope 注解,那么该类再次使用时,新更改的配置会生效。

Config服务端的作用是与git仓库建立连接,继而让Config客户端从Config服务端获取配置文件
1.导入依赖

<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
 <properties>
  <springcloud.version>1.4.6.RELEASE</springcloud.version>
   <springboot.version>2.1.4.RELEASE</springboot.version>
   </properties>
    <dependencies>
        <!--springboot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${springboot.version}</version>
        </dependency>
        <!--config-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
            <version>${springcloud.version}</version>
        </dependency>
    </dependencies>

2.配置服务

server:
  port: 3344
spring:
  application:
    name: springcloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/qq461064002/FIRSTCLOUD-CONFIG.git #git仓库地址

3.启用服务

package com.apex;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
//启动Config服务端服务
@EnableConfigServer
public class ConfigServer3344Application {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServer3344Application.class,args);
    }
}

4.实际效果
访问Config服务端地址/配置文件名-dev.yml即可看见文件内容。
在这里插入图片描述

Config客户端

Config客户端是实际需要配置文件的一方,需要从Config服务端获取配置文件信息。

1.导入依赖

<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
 <properties>
  <springcloud.version>1.4.6.RELEASE</springcloud.version>
   <springboot.version>2.1.4.RELEASE</springboot.version>
   </properties>
    <dependencies>
        <!--config客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>${springcloud.version}</version>
        </dependency>
        <!--springboot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${springboot.version}</version>
        </dependency>
    </dependencies>

2.配置服务

application.yml

#用户级别配置
spring:
  application:
    name: CONFIGCLIENT3355

boostrap.yml

#系统级别配置
spring:
  cloud:
    config:
      name: application
      profile: test #选择yml中环境版本
      label: master #选择git分支
      uri: http://localhost:3344 #config服务端地址




3.启动服务

package com.apex;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

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

实际效果
获取到了远程仓库的端口配置
在这里插入图片描述

远程配置文件的配置信息

spring:
  profiles:
  #默认是dev配置环境
    active: dev

---
#dev配置环境
spring:
  profiles: dev
server:
  port: 8000

#以---间隔不同的配置环境
---
#test的配置环境
spring:
  profiles: test  
server:
  port: 8090

有对源代码感兴趣的可以去gitee仓库下载学习,git仓库地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值