SpringCloud使用

news2024/11/20 0:33:14

一 、SpringCloud项目简介

SpringCloud项目可划为三个角色,一个是服务的注册与发现中心(Eureka ),一个是服务的提供方(Provider),最后一个是服务的消费方(Consumer),首先我们要保证Eureka能够正常的运行,让Provider在Eureka上注册服务,然后Consumer就能够在Eureka上发现Provider服务,并可以通过RPC远程调用的方式对Provider服务进行调用,这就是一个简单的微服务结构模型。结构图如下所示:

二、构建项目相关目录

1.构建一个maven项目

输入项目名称以及所在位置,这里我是用springcloud_demo作为项目名称:

删除新建项目下的src文件夹,因为我们只需要新建项目的架子,让其存放其他的子服务:

2.创建注册中心子模块:eureka-server

选择Spring Initializr:

填写项目名称eureka-server,选择java版本,这里我选的是java8版本:

选择Spring Cloud Discovery,勾选Eureka Server:

确认子模块名称以及所在位置:

导入依赖:

创建成功效果图:

3.创建提供服务子模块:provider

除了Spring Cloud Discovery中勾选Eureka Discovery Client外,创建方式与创建eureka-server子模块方式一致

4.创建服务消费子模块:consumer

除了Spring Cloud Discovery中勾选Eureka Discovery Client外,创建方式与创建eureka-server子模块方式一致

三、服务调用

1.eureka-server子模块

在该启动类中加上​​@EnableEurekaServer​​注解,声明为注册中心:

package com.example.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;


//启动类标识
@SpringBootApplication
//声明为注册中心
@EnableEurekaServer
public class EurekaServerApplication {

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

}

把resources下的application.properties文件名改为​​application.yml​​(快捷键:shift+f6),并添加以下内容:

server:
  #运行端口
  port: 8888
eureka:
  instance:
    #注册ip
    hostname: localhost
  client:
    #禁止自己当做服务注册
    register-with-eureka: false
    #屏蔽注册信息
    fetch-registry: false
    #注册url
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

对应的pom.xml文件如下

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR7</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.provider子模块

在该启动类中加上​​@EnableEurekaClient​​注解,声明为注册服务:

package com.example.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

//启动类标识
@SpringBootApplication
//声明为注册服务
@EnableEurekaClient
public class ProviderApplication {

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

}

把resources下的application.properties文件名改为​​application.yml​​(快捷键:shift+f6),并添加以下内容:

eureka:
  client:
    serviceUrl:
      #服务注册地址
      defaultZone: http://localhost:8888/eureka/
server:
  #运行端口
  port: 8763
spring:
  application:
    #服务注册名称
    name: service-provider

新建controller包,并新建控制器类​​TestController​​示例:

package com.example.provider.controller;

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

/**
 * @Description:服务端控制器
 */
@RequestMapping("test")
@RestController
public class TestController {

    @RequestMapping("getName")
    public String getName(){
        return "SpringCloud!";
    }
}

3.consumer子模块

在该启动类中加上​​@EnableEurekaClient​​注解,声明为注册服务:

package com.example.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

//启动类标识
@SpringBootApplication
//声明为注册服务
@EnableEurekaClient
//把调用注册子模块接口引入到Spring容器中(不加此注解会出现找不到@FeignClient修饰的接口)
@EnableFeignClients
public class ConsumerApplication {

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

    //把RestTemplate注入到Spring容器中(不然会找不到该RestTemplate类)
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

把resources下的application.properties文件名改为​​application.yml​​(快捷键:shift+f6),并添加以下内容:

eureka:
  client:
    serviceUrl:
      #服务注册地址
      defaultZone: http://localhost:8888/eureka/
server:
  #运行端口
  port: 8764
spring:
  application:
    #服务注册名称
    name: service-consumer

调用方式一:使用RestTemplate调用注册子模块接口方法

新建service包,并新建一个​​ConsumerService​​类:

package com.example.consumer.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * @Description:使用RestTemplate调用注册子模块接口方法
 */
@Service
public class ConsumerService {

    @Autowired
    private RestTemplate restTemplate;

    public String getName() {
        //调用子模块接口地址
        String name = restTemplate.getForObject("http://service-provider/test/getName", String.class);
        return name;
    }
}

调用方式二:使用@FeignClient注解调用注册子模块接口方法

在service包下新建一个​​ConsumerService1​​类:

package com.example.consumer.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * @Description:使用@FeignClient注解调用注册子模块接口方法
 */
//注册子模块名称
@FeignClient(value = "service-provider")
public interface ConsumerService1 {

    //接口访问地址
    @GetMapping("test/getName")
    public String getName1();

}

创建启动类

package com.example.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

//启动类标识
@SpringBootApplication
//声明为注册服务
@EnableEurekaClient
//把调用注册子模块接口引入到Spring容器中(不加此注解会出现找不到@FeignClient修饰的接口)
@EnableFeignClients
public class ConsumerApplication {

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

    //把RestTemplate注入到Spring容器中(不然会找不到该RestTemplate类)
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

新建controller包,并新建控制器类​​ConsumerController​​:

package com.example.consumer.controller;

import com.example.consumer.service.ConsumerService;
import com.example.consumer.service.ConsumerService1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description:消费端控制器
 */
@RequestMapping("consumer")
@RestController
public class ConsumerController {

    @Autowired
    private ConsumerService consumerService;

    @Autowired
    private ConsumerService1 consumerService1;

    /**方式一:RestTemplate调用
     * @return
     */
    @RequestMapping("getName")
    public String getName(){
        return consumerService.getName();
    }

    /**
     * 方式二:@FeignClient调用
     * @return
     */
    @RequestMapping("getName1")
    public String getName1(){
        return consumerService1.getName1();
    }


}

4.服务网关

Spring Cloud的一个组件:zuul,它提供微服务的网关功能,即中转站,通过它提供的接口,可以转发不同的服务。它的作用就是进行路由转发、异常处理和过滤拦截。

4.1 创建gateway工程

创建一个名为 gateway 的工程,在其 pom.xml 中,加入如下依赖:

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
</dependencies>

创建 Application 启动类,并增加 ​​@EnableZuulProxy​​ 注解:

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

最后添加 application.yml 配置文件,内容如下:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8080
spring:
  application:
    name: gateway
zuul:
  routes:
    api:
      path: /api/**
      serviceId: eurekaclient

我们可以看到,服务网关的配置多了几项,具体含义如下。

zuul.routes.api.path:指定请求基础地址,其中 API 可以是任何字符。

serviceId:转发到的服务 ID,也就是指定服务的 application.name,上述实例的含义表示只要包含 /api/ 的地址,都自动转发到 eurekaclient 的服务去。

然后我们启动服务注册中心、服务提供者、服务网关,访问地址:http://localhost:8080/api/index,我们可以看到和之前的界面完全一样。其实只要引入了 zuul,它就会自动帮我们实现反向代理和负载均衡。配置文件中的地址转发其实就是一个反向代理,那它如何实现负载均衡呢?

我们修改服务提供者的 Controller 如下:

RestController
public class HelloController {
 
    @Value("${server.port}")
    private int port;
 
    @RequestMapping("index")
    public String index(){
        return "Hello World!,端口:"+port;
    }
}

重新启动。然后再修改服务提供者的端口为8673,再次启动它(切记:原先启动的不要停止),访问地址:​​http://localhost:8761​​,我们可以看到 eurekaclient 服务有两个地址:

再不断访问地址:​​http://localhost:8080/api/index​​,可以看到交替出现以下界面:

由此可以得出,当一个服务启动多个端口时,zuul 服务网关会依次请求不同端口,以达到负载均衡的目的。

4.2 服务拦截

前面我们提到,服务网关还有个作用就是接口的安全性校验,这个时候我们就需要通过 zuul 进行统一拦截,zuul 通过继承过滤器 ZuulFilter 进行处理,下面请看具体用法。

新建一个类 ApiFilter 并继承 ZuulFilter:

@Component
public class ApiFilter extends ZuulFilter {
 
    @Override
    public String filterType() {
        return "pre";
    }
 
    @Override
    public int filterOrder() {
        return 0;
    }
 
    @Override
    public boolean shouldFilter() {
        return true;
    }
 
    @Override
    public Object run() {
        //这里写校验代码
        return null;
    }
}

其中:

filterType 为过滤类型,可选值有 pre(路由之前)、routing(路由之时)、post(路由之后)、error(发生错误时调用)。

filterOrdery 为过滤的顺序,如果有多个过滤器,则数字越小越先执行

shouldFilter 表示是否过滤,这里可以做逻辑判断,true 为过滤,false 不过滤

run 为过滤器执行的具体逻辑,在这里可以做很多事情,比如:权限判断、合法性校验等。

下面,我们来做一个简单的安全验证:

@Override
    public Object run() {
        //这里写校验代码
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String token = request.getParameter("token");
        if(!"12345".equals(token)){
            context.setSendZuulResponse(false);
            context.setResponseStatusCode(401);
            try {
                context.getResponse().getWriter().write("token is invalid.");
            }catch (Exception e){}
        }
        return null;
    }

启动 gateway,在浏览器输入地址:​​http://localhost:8080/api/index​​,可以看到以下界面:

再通过浏览器输入地址:​​http://localhost:8080/api/index?token=12345,​​可以看到以下界面:

4.3 错误拦截

在一个大型系统中,服务是部署在不同的服务器下面的,我们难免会遇到某一个服务挂掉或者请求不到的时候,如果不做任何处理,服务网关请求不到会抛出500错误,对用户是不友好的。

我们为了提供用户的友好性,需要返回友好性提示,zuul 为我们提供了一个名叫 ZuulFallbackProvider 的接口,通过它我们就可以对这些请求不到的服务进行错误处理。

新建一个类 ApiFallbackProvider 并且实现 ZuulFallbackProvider 接口:

Component
public class ApiFallbackProvider implements ZuulFallbackProvider{
 
    @Override
    public String getRoute() {
        return "eurekaclient";
    }
 
    @Override
    public ClientHttpResponse fallbackResponse() {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return HttpStatus.OK;
            }
 
            @Override
            public int getRawStatusCode() throws IOException {
                return 200;
            }
 
            @Override
            public String getStatusText() throws IOException {
                return "{code:0,message:\"服务器异常!\"}";
            }
 
            @Override
            public void close() {
 
            }
 
            @Override
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream(getStatusText().getBytes());
            }
 
            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }

其中,getRoute 方法返回要处理错误的服务名,fallbackResponse 方法返回错误的处理规则。

现在开始测试这部分代码,首先停掉服务提供者 eurekaclient,再重启 gateway,请求地址:http://localhost:8080/api/index?token=12345,即可出现以下界面:

5.服务异常处理

我们的服务最终是部署在服务器上,因为各种原因,服务难免会发生故障,那么其他服务去调用这个服务就会调不到,甚至会一直卡在那里,导致用户体验不好。针对这个问题,我们就需要对服务接口做错误处理,一旦发现无法访问服务,则立即返回并报错,我们捕捉到这个异常就可以以可读化的字符串返回到前端。

为了解决这个问题,业界提出了熔断器模型。

Hystrix 组件

SpringCloud 集成了 Netflix 开源的 Hystrix 组件,该组件实现了熔断器模型,它使得我们很方便地实现熔断器。

在实际项目中,一个请求调用多个服务是比较常见的,如果较底层的服务发生故障将会发生连锁反应。这对于一个大型项目是灾难性的。因此,我们需要利用 Hystrix 组件,当特定的服务不可用达到一个阈值(Hystrix 默认5秒20次),将打开熔断器,即可避免发生连锁反应。

代码实现

在 application.yml 中开启:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8081
spring:
  application:
    name: feign
#开启熔断器
feign:
  hystrix:
    enabled: true

新建一个类 ApiServiceError.java 并实现 ApiService:

@Component
public class ApiServiceError implements ApiService {
 
    @Override
    public String index() {
        return "服务发生故障!";
    }
}

然后在 ApiService 的注解中指定 fallback:

@FeignClient(value = "eurekaclient",fallback = ApiServiceError.class)
public interface ApiService {
 
    @RequestMapping(value = "/index",method = RequestMethod.GET)
    String index();
}

再创建 Controller 类:ApiController,加入如下代码:

@RestController
public class ApiController {
 
    @Autowired
    private ApiService apiService;
 
    @RequestMapping("index")
    public String index(){
        return apiService.index();
    }
}

测试熔断器

分别启动注册中心 、服务提供者 和服务消费者 ,然后访问:​​http://localhost:8081/index​​,可以看到顺利请求到接口:

然后停止 EurekaClient,再次请求,可以看到熔断器生效了:

6 配置中心

通过前面的例子我们可以看出,SpringCloud 有很多组件,使用每个组件都会创建一个工程,而每个工程都会有一个配置文件,并且有些配置是一样的。例如:在实际项目中,我们创建了用户和订单两个服务,这两个服务是同一个数据库,那么我们在这两个服务的配置文件都会配置相同的数据源,一旦我们的数据库地址发生改变(只是一种情况),用户和订单两个服务的配置文件都需要改,这还是只是两个服务,在一个大型系统(比如淘宝),将会有成千上万个服务,按照这种方式代价无疑是巨大的。

因此,产生了Spring Cloud Config 组件。Spring Cloud Config 是一个高可用的分布式配置中心,它支持将配置存放到内存(本地),也支持将其放到 Git 仓库进行统一管理

创建服务端

首先是服务端这块,首先创建一个注册中心,为了进行区分,创建一个​​springcloud-config-eureka​​​的项目。 ​​​application.properties​​配置信息:

spring.application.name=springcloud-config-eureka

server.port=8000
## 表示是否将自己注册到Eureka Server,默认为true。
eureka.client.register-with-eureka=false
## 表示是否从Eureka Server获取注册信息,默认为true。
eureka.client.fetch-registry=false

## 设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

启动类Application:

package com.pancm;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * 
* @Title: Application
* @Description: 
* springcloud服务入口
  EnableEurekaServer 注解启动一个服务注册中心
 */
@SpringBootApplication
@EnableEurekaServer
public class Application {

   public static void main(String[] args) {
      SpringApplication.run(Application.class, args);
       System.out.println("注册中心服务启动...");
   }
}

创建配置中心

创建一个​​springcloud-config-server​​​的项目。然后在​​application.properties​​配置文件添加如下配置:

spring.application.name=springcloud-config-server

server.port=9005

## 设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

## 读取本地文件
# spring.profiles.active=native


## 读取git的路径
# git仓库的地址
 spring.cloud.config.server.git.uri = https://github.com/xuwujing/springcloud-study-old/
# git仓库地址下的相对地址 多个用逗号","分割
 spring.cloud.config.server.git.search-paths = /springcloud-config/config-repo
# git仓库的账号
 spring.cloud.config.server.git.username = 
# git仓库的密码
 spring.cloud.config.server.git.password =

如果想使用本地方式读取配置信息,那么只需将​​spring.cloud.config.server.git​​​的配置改成​​spring.profiles.active=native​​,然后在resources路径下新增一个文件即可。

这里为了进行本地配置文件测试,新建一个​​configtest.properties​​配置文件,添加如下内容:

word=hello world

启动类Application:

package com.pancm;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.config.server.EnableConfigServer;
/**
 * 
* @Title: Application
* @Description:
* 程序入口 
* EnableDiscoveryClient: 启用服务注册与发现
  EnableConfigServer:    启用config配置中心
 */
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
public class Application {

   public static void main(String[] args) {
      SpringApplication.run(Application.class, args);
      System.out.println("配置中心服务端启动成功!");
   }
}

创建客户端

我们新建一个​​springcloud-config-client​​​的项目,用于做读取配置中心的配置。pom依赖还是和配置中心一样,不过需要新增一个配置,用于指定配置的读取。 创建一个​​​bootstrap.properties​​文件,并添加如下信息:

# 获取配置文件的名称。
spring.cloud.config.name=configtest
# 获取配置的策略。
spring.cloud.config.profile=pro
# 获取配置文件的分支,默认是master。如果是是本地获取的话,则无用
spring.cloud.config.label=master
# 开启配置信息发现
spring.cloud.config.discovery.enabled=true
# 指定配置中心的service-id
spring.cloud.config.discovery.serviceId=springcloud-config-server
#  这个是设置与Eureka Server交互的地址,客户端的查询服务和注册服务都需要依赖这个地址
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

:上面这些与spring-cloud相关的属性必须配置在bootstrap.properties中,config部分内容才能被正确加载。因为bootstrap.properties的相关配置会先于application.properties,而bootstrap.properties的加载也是先于application.properties。需要注意的是​​eureka.client.serviceUrl.defaultZone​​要配置在bootstrap.properties,不然客户端是无法获取配置中心参数的,会启动失败!

application.properties配置

spring.application.name=springcloud-config-client
server.port=9006

启动类Application:

package com.pancm;


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

/**
 * 
* @Title: Application
* @Description:
* 程序入口 
* EnableDiscoveryClient 表示该项目就具有了服务注册的功能
 */
@EnableDiscoveryClient
@SpringBootApplication
public class Application {

   public static void main(String[] args) {
      SpringApplication.run(Application.class, args);
      System.out.println("配置中心客户端启动成功!");
   }
}
功能测试

(1)本地测试

首先我们把springcloud-config-server项目的application.properties配置文件添加spring.profiles.active=native配置,注释掉spring.cloud.config.server.git相关的配置,然后在src/main/resources目录下新建一个configtest.properties文件,然后在里面添加一个配置word=hello world。

添加完成之后,我们依次启动springcloud-config-eureka、springcloud-config-server、springcloud-config-client这三个项目。

在浏览器输入:http://localhost:9005/configtest-1.properties 查看该文件的配置信息。

:配置文件的名称是​​configtest.properties​​,但是如果直接该名称的话是获取不到的,因为在配置文件名需要通过​​-​​来进行获取,如果配置文件名称没有​​-​​,那么添加了​​-​​之后,会自动进行匹配搜索。

调用客户端的接口,查看是否能够获取配置信息。在浏览器上输入:

​​http://localhost:9006//hello?name=pancm​​

(2)Git测试

在完成本地测试之后,我们把这个spring.profiles.active=native配置注释掉,解除spring.cloud.config.server.git相关的注释(账号和密码要填写真实的),然后在git仓库上建立一个config-repo 文件夹,新建configtest-pro.properties、configtest-dev.properties两个配置,这两个的配置分别是word=hello world174 和word=hello world258, 然后和configtest.properties配置文件一起上传到config-repo 文件夹中。

在浏览器输入:​​http://localhost:9005/configtest-dev.properties​​

在浏览器输入: ​​http://localhost:9005/configtest-pro.properties​​

在浏览器输入:​​http://localhost:9005/configtest-1.properties​​

然后进行客户端接口调用测试,在浏览器输入:​​http://localhost:9006/hello?name=pancm​​

四、服务启动

1.首先启动​eureka-server​

找到该子模块的启动类,启动该模块:

在浏览器中输入:​​localhost:8888​​,出现Eureka注册中心管理页面:

2. 启动​provider-server​

刷新Eureka注册中心管理页面:

3.启动​consumer-server​

刷新Eureka注册中心管理页面:

4. 访问消费端接口

1.在浏览器中输入:http://localhost:8764/consumer/getName,成功得到返回结果:

2.在浏览器中输入:http://localhost:8764/consumer/getName1,成功得到返回结果:

资料来源

1 ​​Spring Cloud入门-十分钟了解Spring Cloud-CSDN博客​​

2 ​​SpringCloud从入门到精通(超详细文档一)_cuiqwei的博客-CSDN博客​​

3 ​​使用Idea构建SpringCloud项目(图文详解+简单易懂)_idea springcloud-CSDN博客​​

4 ​​从零搭建SpringCloud服务(史上最详细)​​

5 ​​超详细SpringCloud入门Demo​​

6 ​​SpringCloud学习系列之四-----配置中心(Config)使用详解_springcloud使用config-CSDN博客​​

7 ​​SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)-CSDN博客​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1507427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言内存管理-堆内存

堆内存&#xff08;heap&#xff09;又被称为动态内存、自由内存&#xff0c;简称堆。堆是唯一可被开发者自定义的区段&#xff0c;开发者可以根据需要申请内存的大小、决定使用的时间长短等。但又由于这是一块系统“飞地”&#xff0c;所有的细节均由开发者自己把握&#xff0…

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript 不同版本4.8-4.28(最新版)离线部署

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript 不同版本4.8-4.28&#xff08;最新版&#xff09;SDK离线部署 测试资源4.18 以及之前版本4.19 以及之后版本 接触一段时间 ArcGIS JSAPI 之后&#xff0c;整体感觉还好&#xff0c;后来需要解决不同版本问题&#xff0…

学习Java的第六天

目录 一、变量 1、变量的定义 2、变量的声明格式 3、变量的注意事项 4、变量的作用域 二、常量 三、命名规范 Java 语言支持如下运算符&#xff1a; 1、算术运算符 解析图&#xff1a; 示例&#xff1a; 2、赋值运算符 解析图&#xff1a; 示例&#xff1a; 3、关…

若依项目部署之后页面无法展示,一直在加载的解决办法

解决办法 1. srore/modules/permission.js export const loadView (view) > {if (process.env.NODE_ENV "development") {return (resolve) > require([/views/${view}], resolve);} else {// return () > import(/views/${view});return (resolve) >…

如何从碎屏的华为手机恢复数据?6 种热门方法

“只是想知道是否可以从屏幕损坏的华为恢复数据&#xff1f;我尝试将其插入我的笔记本电脑&#xff0c;但手机不允许我进入&#xff0c;因为它要求我更改手机中的设置等.我最好的选择是什么&#xff1f; 当发生事故&#xff0c;我们的华为手机屏幕损坏时&#xff0c;访问这些关…

selenium也能过某数、5s盾..

文章转载于&#xff1a;selenium也能过某数、5s盾… 直接安装: pip install undetected_chromedriver运行代码&#xff1a; import undetected_chromedriver as uc import timedriver uc.Chrome(executable_pathrC:\Users\chromedriver.exe,version_main111) driver.get(网…

从element-plus 引入ILoadingInstance 出现类型错误

具体报错如下图所示&#xff1a; 1、引入ILoadingInstance 出现错误&#xff1a; 解决问题如下所示&#xff1a; 可能是因为element-plus 多次升级原因&#xff0c;将原来的内部代码多次改下了&#xff0c;原来是loading.type文件&#xff0c;现在变成loading.js&#xff0c;包…

传统FTP传输存在哪些局限性?如何进行FTP替代?

说到文件传输产品&#xff0c;很多人第一反应都是FTP&#xff0c;FTP是一种通用的文件传输协议&#xff0c;在各种操作系统和网络环境下都得到广泛支持&#xff0c;使用方便&#xff0c;确实在文件传输领域风靡了很多年&#xff0c;但随着互联网技术的发展和企业数字化需求的提…

HuggingFace团队亲授:如何使用HuggingFace上的开源模型

Open Source Models with Hugging Face 本文是 https://www.deeplearning.ai/short-courses/open-source-models-hugging-face/ 这门课程的学习笔记。 文章目录 Open Source Models with Hugging FaceWhat you’ll learn in this course Lesson 1: Selecting ModelsLesson 2: …

hutool,真香!

大家好&#xff0c;我是苏三&#xff0c;又跟大家见面了。 前言 今天给大家介绍一个能够帮助大家提升开发效率的开源工具包&#xff1a;hutool。 Hutool是一个小而全的Java工具类库&#xff0c;通过静态方法封装&#xff0c;降低相关API的学习成本&#xff0c;提高工作效率&…

【Wio Terminal】使用WiFi(3)- Wi-F的高级使用

使用WiFi&#xff08;3&#xff09; Wi-F的高级使用HTTPClient 的使用HTTP GETHTTPs GETHTTP POSTWebServerHTTP Authentication Web ServerDNSServermDNSmDNS-SDWiFiManager Wi-F的高级使用 本节介绍了一些WiFi的高级库用法&#xff0c;如HTTPClient、DNSServer和WebServer库…

fastjson2 简单使用

参考 https://alibaba.github.io/fastjson2/ https://alibaba.github.io/fastjson2/annotations_cn.html https://alibaba.github.io/fastjson2/features_cn 基本操作 json 字符串转为 jsonObject&#xff1a; String json "{\"name\":\"tom\",\…

HTML5+CSS3+移动web——CSS基础

系列文章目录 HTML5CSS3移动web——HTML 基础-CSDN博客https://blog.csdn.net/ymxk2876721452/article/details/136070953?spm1001.2014.3001.5501HTML5CSS3移动web——列表、表格、表单-CSDN博客https://blog.csdn.net/ymxk2876721452/article/details/136221443?spm1001.2…

SOC的多核启动流程详解

目录 1、基础概念2、启动流程3、ATF(TF-A)代码的剖析5、软件如何判断当前是cold reset/warm reset/primary boot/senondary boot5.1 cold reset和warm reset5.2 primary boot和secondary boot 6、mailbox的介绍6.1 mailbox是什么6.2 mailbox的作用6.3 mailbox的示例 7、具体场景…

案例分析01-题型分析与历年案例题真题考点汇总(2024年软考高级系统架构设计师冲刺知识点总结)

1、历年真题案例分析题考点汇总 1.1 2018年~2023年 1.2 2012年~2017年 2、考试安排 案例分析题的考试安排在下午&#xff0c;时间为1.5小时&#xff0c;相对来说比较轻松。 上午&#xff1a;09:00-11:30,150分钟&#xff0c;2.5小时 综合知识题&#xff0c;全选择题&#xff…

Ps:画笔工具

画笔工具 Brush Tool是 Photoshop 中最常用的工具&#xff0c;可广泛地用于绘画与修饰工作之中。 快捷键&#xff1a;B ◆ ◆ ◆ 常用操作方法与技巧 1、熟练掌握画笔工具的操作对于使用其他工具也非常有益&#xff0c;因为 Photoshop 中许多与笔刷相关的工具有类似的选项和操…

职场成功的关键:积极主动,勇于担当

在职场中&#xff0c;每个人都渴望成功。然而&#xff0c;成功并非一蹴而就&#xff0c;而是需要我们在日常工作中不断积累、锻炼和提升。本文将为您揭示职场成功的关键因素&#xff0c;帮助您在职场道路上越走越远。 一、积极主动&#xff0c;主动承担责任 在职场中&#xff0…

基于多源信息融合的巡飞弹对地目标识别与毁伤评估

源自&#xff1a;系统仿真学报 作者&#xff1a;徐艺博 于清华 王炎娟 郭策 冯世如 卢惠民 “人工智能技术与咨询” 发布 摘 要 面向利用多枚巡飞弹对地面高防御移动目标进行打击的任务场景&#xff0c;提出一种基于多源信息融合的巡飞弹对地移动目标识别与毁伤评估方法…

【C++从练气到飞升】02---初识类与对象

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 ⛳️推荐 一、面向过程和面向对象初步认识 二、类的引用 1. C语言版 2. C版 三、类的定义 类的两种定义方式&#xff…

趣学前端 | JavaScript标准库

背景 最近睡前习惯翻会书&#xff0c;重温了《JavaScript权威指南》这本书。这本书&#xff0c;文字小&#xff0c;内容多。两年了&#xff0c;我才翻到第十章。因为书太厚&#xff0c;平时都充当电脑支架。 JavaScript标准库 今天阅读的章节是JavaScript标准库&#xff0c;…