springCloud入门实战

笔记

记一半后面补

 

1.SpringCloud模块介绍

  • Euraka:服务注册中心,用于服务管理
  • Ribbon:基于客户端的负载均衡组件
  • Hystrix:容错框架,能够防止服务的雪崩效应
  • Feign:Web服务客户端,能够简化HTTP接口的调用
  • Zuul:API网关,提供路由转发,请求过滤等功能
  • Config:分布式配置管理
  • Sleuth:服务跟踪
  • Stream:构建消息驱动的微服务应用程序的框架
  • Bus:消息代理的集群消息总线

 

使用的spring-boot与spring-cloud版本:

spring-boot:2.0.6

spring-cloud:Finchley.SR2

 

实战

 

(一)注册中心

1.1 Eureka注册中心

一句话总结:eureka是分布式系统中基于AP原则实现的服务注册中心

1.2 创建一个maven项目eureka-server,导入依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
    </parent>

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

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

1.3 在resources中添加配置文件application.properties

spring.application.name=eureka-server
server.port=8761

# 不向注册中心注册自己
eureka.client.register-with-eureka=false
# 不去检索服务
eureka.client.fetch-registry=false

1.4 创建一个包添加启动类

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

1.5 开启EurekaServerApplication主类,访问8761端口

 

 

eureka.client.register-with-eureka=false一定要配成false,否则会报错

(二)编写服务提供者
2.1 创建maven项目eureka-client-user-service,导入依赖,提供一个接口给其他服务调用
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>

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

</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

2.2 创建一个启动类

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

 

2.3 在resources新建配置文件application.properties

spring.application.name=eureka-client-user-service
server.port=8081
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
# 采用IP注册
eureka.instance.prefer-ip-address=true
# 定义实例ID格式
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}

 

2.4 新建一个controller包提供接口

@RestController
public class UserController {


    @GetMapping("/user/hello")
    public String hello(){
        return "hello";
    }

}

 

 

(三)编写服务消费者

3.1 创建maven项目eureka-client-artile-service,添加依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
    </parent>

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 

3.2 在resources下编写配置文件application.properties

spring.application.name=eureka-client-article-service
server.port=8088
# 采用IP注册
eureka.instance.prefer-ip-address=true
# 定义实例ID格式
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}

 

3.3 配置RestTemplate来调用接口,添加配置类

@Configuration
public class BeanConfiguration {

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

}

 

3.4 编写调用接口的controller

@RestController
public class ArticleController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/article/callHello")
    public String callHello(){
        return restTemplate.getForObject("http://eureka-client-user-service/user/hello",String.class);
    }

}

 

3.5 添加启动类

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

 

3.6 开启eureka-server,eureka-client-user-service,eureka-client-article-service三个项目的启动类

效果展示: 

  1) 访问http://localhost:8761/,eureka注册中心中有两个服务以及注册

 

   2) 访问http://localhost:8081/user/hello 返回hello,说明接口提供成功

 

 

   3) 访问http://localhost:8088/article/callHello 返回hello,说明跨服务访问接口成功!

 

 

 小结:

注册中心,服务提供者,服务消费者之间的关系:

三者都可以独立存在,互不影响

 

 

拓展:

开启eureka认证

1.改造eureka-server项目,添加Spring-Security依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
    </parent>

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

        <!--pom添加依赖,然后添加一个security配置类(config包下)-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 

2.修改配置文件

spring.application.name=eureka-server
server.port=8761

# 不向注册中心注册自己
eureka.client.register-with-eureka=false
# 不去检索服务
eureka.client.fetch-registry=false

# ===============改造eureka==============
# 用户名
spring.security.user.name=gg
# 密码
spring.security.user.password=123456

 

3.新建一个security配置类

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        // 关闭csrf
        http.csrf().disable();
        // 支持httBasic
        http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .httpBasic();
    }
}

 

4.开启eureka-server的启动类,访问http://localhost:8761/

 

 

 

此时,我们需要访问注册中心需要输入用户名和密码认证才能访问

那么服务如何注册到注册中心呢?

修改eureka-client-user-service项目的配置文件即可

spring.application.name=eureka-client-user-service
server.port=8081
eureka.client.service-url.defaultZone=http://gg:123456@localhost:8761/eureka/
# 采用IP注册
eureka.instance.prefer-ip-address=true
# 定义实例ID格式
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}

然后开启eureka-client-user-service的启动类,进入eureka注册中心就可以看到服务注册了

 

 

(二)Ribbon

1.1 一句话总结:开源的一款用于客户端负载均衡的工具

 

可以先把上面的eureka认证去掉

1.2 首先在eureka-client-user-service中添加一个实体类

public class HouseInfo {
    private Long id;
    private String AreaOne;
    private String AreaTwo;
    private String AreaThree;

// 以下方法省略

 

再提供一个接口controller(提供水果给消费者拿)

@RestController
public class HouseController {

    @GetMapping("/house/data")
    public HouseInfo getData(@RequestParam("name") String name){
        return new HouseInfo(1L,"1","2","3");
    }

    @GetMapping("/house/data/{name}")
    public String getData2(@PathVariable("name") String name){
        return name;
    }

    @PostMapping("/house/save")
    public Long add(@RequestBody HouseInfo houseInfo){

        System.out.println(houseInfo.getAreaTwo());
        return 1001L;
    }


}

 

 

1.3 创建maven项目spring-rest-template,导入依赖,把eureka-client-user-service中添加的实体类引入

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>com.gg</groupId>
            <artifactId>eureka-client-user-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 

1.4 在spring-rest-template项目中调用接口(方式1:通过访问: ip地址 + 端口 + 接口地址)

添加配置类

@Configuration
public class BeanConfiguration {

    @Bean   // 原始的微服务调用接口方式
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

}

 

编写controller调用接口(getForObject,getForEntity   postForObject,postForEntity 用法相同)

@RestController
public class HouseClientController {

    @Autowired
    @Qualifier("getRestTemplate")
    private RestTemplate restTemplate;

    @GetMapping("/call/data")
    public HouseInfo getData(@RequestParam("name") String name){
        return restTemplate.getForObject("http://localhost:8081/house/data?name=" + name,HouseInfo.class);
    }

    @GetMapping("/call/data/{name}")
    public String getData2(@PathVariable("name") String name){
        return restTemplate.getForObject("http://localhost:8081/house/data/{name}",String.class,name);
    }

    @GetMapping("/call/dataEntity")
    public HouseInfo getData3(@RequestParam("name") String name){
        ResponseEntity<HouseInfo> responseEntity = restTemplate.getForEntity("http://localhost:8081/house/data?name=" + name, HouseInfo.class);
        System.out.println(responseEntity.getHeaders());
        System.out.println(responseEntity.getStatusCode());
        return responseEntity.getBody();
    }

    @PostMapping("/call/save")
    public Long add(@RequestBody HouseInfo houseInfo){
        Long id = restTemplate.postForObject("http://localhost:8081/house/save",houseInfo,Long.class);
//        ResponseEntity<Long> responseEntity = restTemplate.postForEntity("http://localhost:8081/house/save", houseInfo, Long.class);
        return 2L;
    }

}

 

1.5 启动eureka-server,eurela-client-user-service,spring-rest-trmplate三个项目的启动类

(1)访问 http://localhost:8761/,注册中心显示注册了两个服务

 

 (2) 查看接口提供是否成功

访问 http://localhost:8081/house/data?name=4

 

 

访问 http://localhost:8081/house/data/2

 

 

post请求我们需要用到api接口工具

 

 

接口提供没问题

 

(3)消费者消费接口(8001端口)

 

 

 

 

 

 

 

1.6 调用接口方式2,通过服务名调用

在spring-rest-template项目的配置类中添加 @LoadBalanced直接

@Configuration
public class BeanConfiguration {

    @Bean
    @LoadBalanced // 加上这个注解可以通过服务名调用接口
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

}

通过服务名调用接口

 

 

新建一个Controller测试

@RestController
public class LoadBalancedTestController {

    @Autowired
    @Qualifier("getRestTemplate")
    private RestTemplate restTemplate;

    @GetMapping("/call/load")
    public HouseInfo getData(@RequestParam("name") String name){
        return restTemplate.getForObject("http://EUREKA-CLIENT-USER-SERVICE/house/data?name="+name,HouseInfo.class);
    }
}

 

重启spring-rest-template项目访问接口

 

@Configuration
public class BeanConfiguration {

    @Bean   // 原始的微服务调用接口方式
    // return restTemplate.getForObject("http://localhost:8081/house/data?name=" + name,HouseInfo.class);
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    @Bean
    @LoadBalanced // 加上这个注解可以通过服务名调用接口
    // return restTemplate.getForObject("http://EUREKA-CLIENT-USER-SERVICE/house/data?name="+name,HouseInfo.class);
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

}

 

(三) Feign

1.1 一句话总结:Feign是对代理HTTP调用接口的封装

为了简化接口出现的

 

1.2 创建一个feign-api接口,导入依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
    </parent>


    <dependencies>
        <dependency>
            <groupId>com.gg</groupId>
            <artifactId>eureka-client-user-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 

1.3 设置端口

server.port=8003

 

1.4 添加feign启动类

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

 

1.5 定义feign接口

/**
 * 定义接口
 */
@FeignClient(value = "EUREKA-CLIENT-USER-SERVICE")
public interface UserRemoteClient {


    @GetMapping("/user/hello")
    String hello();


    @GetMapping("/house/data")
    HouseInfo getData(@RequestParam("name") String name);

    @GetMapping("/house/data/{name}")
    String getData2(@PathVariable("name") String name);

    @PostMapping("/house/save")
    Long add(@RequestBody HouseInfo houseInfo);

}

 

1.6 feign调用接口

/**
 * feign调用接口
 */
@RestController
public class FeignTestController {

    @Autowired
    private UserRemoteClient userRemoteClient;  // 注入feign接口

    @GetMapping("/user/hello")
    public String hello() {

        return userRemoteClient.hello();
    }


    @GetMapping("/house/data")
    public HouseInfo getData(@RequestParam("name") String name){
        return userRemoteClient.getData(name);
    }


    @GetMapping("/house/data/{name}")
    public String getData2(@PathVariable("name") String name){
        return userRemoteClient.getData2(name);
    }

    @PostMapping("/house/save")
    public Long add(@RequestBody HouseInfo houseInfo){
        return userRemoteClient.add(houseInfo);
    }

}

 

1.7 开启feign启动类测试

 

 

 

 

 

 

 

 

小结:

ribbon通过访问服务地址或服务名来调用接口

feign简化了接口调用的方式,更方便,更符合面向对象的编程思想

 

(四)Hystrix

1.1 一句话总结:Hystrix是微服务分布式系统采用的熔断保护中间件

 

1.2 创建项目导入依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
    </parent>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 

1.3 主类添加注解

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


配置文件

server.port=8007

 

1.4 配置类

@Configuration
public class HystrixConfig {

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

 

1.5 简单使用

@RestController
public class HystrixController {

    @Autowired
    @Qualifier("getRestTemplate")
    private RestTemplate restTemplate;

    @GetMapping("/callHello")
    @HystrixCommand(fallbackMethod = "defaultCallHello")
    public String callHell(){
        return restTemplate.getForObject("http://localhost:8081/user/hello",String.class);
    }

    public String defaultCallHello(){
        return "fail";
    }
    
}

 

1.6 测试

当没有开启eureka-client-user-service项目时,访问/callHello将返回失败回调defaultCallHello方法

 

 

 

当开启了eureka-client-user-service项目时,会返回成功回调

 

 

 

 

(五)Feign整合Hystrix服务容错

1.1 创建maven项目hystrix-feign-service,导入依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
    </parent>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 

1.2 开启Feign对hystrix的支持

server.port=8004
feign.hystrix.enabled=true

 

1.3 添加主类

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

 

1.4 方式一:Fallback方式

(1)定义feign接口

// Fallback方式
@FeignClient(value = "EUREKA-CLIENT-USER-SERVICE", fallback = UserRemoteClientFallback.class)
@Component
public interface UserRemoteService {

    @GetMapping("/user/hello")
    String hello();

    @GetMapping("/user/hello2")
    String hello2();

}

 

(2)实现接口

@Component
public class UserRemoteClientFallback implements UserRemoteService {

    @Override
    public String hello() {
        return "Fallback->fail";
    }

    @Override
    public String hello2() {
        return "Fallback->fail2";
    }
}

 

1.5 web 层

@RestController
public class HystrixController {

    @Autowired
    private UserRemoteService UserRemoteService;

    @Autowired
    @Qualifier("getRestTemplate")
    private RestTemplate restTemplate;

    @GetMapping("/callHello")
    @HystrixCommand(fallbackMethod = "defaultCallHello")
    public String callHell(){
        return restTemplate.getForObject("http://localhost:8081/user/hello",String.class);
    }

    public String defaultCallHello(){
        return "fail";
    }

    @GetMapping("/user/hello")
    public String hello(){
        return UserRemoteService.hello();
    }


    @GetMapping("/user/hello2")
    public String hello2(){
        return UserRemoteService.hello2();
    }


}

 

1.6 测试

开启eureka-server,eureka-client-user-service,hystrix-feign-service

注册中心注册两个服务

 

 

 eureka-client-user-service提供hello接口成功

 

 

 未提供hello2接口

 

 

 

hystrix-feign-service项目调用hello成功,调用hello2返回失败回调

 

 

 

 

 

 

 

 

 

1.7 方式二:FallbackFactory

(1)添加回退工厂类

@Component
public class UserRemoteServiceFallbackFactory implements FallbackFactory<UserRemoteService> {
    @Override
    public UserRemoteService create(Throwable throwable) {
        return new UserRemoteService() {
            @Override
            public String hello() {
                return "FallbackFactory1";
            }

            @Override
            public String hello2() {
                return "FallbackFactory2";
            }
        };
    }
}

 

(2)修改Feign接口

@FeignClient(value = "EUREKA-CLIENT-USER-SERVICE",fallbackFactory = UserRemoteServiceFallbackFactory.class)
@Component
public interface UserRemoteService {

    @GetMapping("/user/hello")
    String hello();

    @GetMapping("/user/hello2")
    String hello2();

}

 

1.8 重启服务测试

hystrix-feign-service项目调用hello成功,调用hello2返回失败回调

 

 

 

 

 

 

 

 

(六) Zuul

1.1 一句话总结:Zuul是一个基于JVM路由和服务端的负载均衡器

 

1.2 简单使用,创建项目导入依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
    </parent>

    
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 

1.3 配置zuul路由转发

spring.application.name=zuul-demo
server.port=2103

# 配置路由转发
zuul.routes.user-server.path=/user/**
# 配置跳转路径
zuul.routes.user-server.service-id=eureka-client-user-service
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

则所有访问/user/路径都会转发到:  http://eureka-client-user-service/  

 

1.4 添加主类

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

 

1.5 测试

测试接口是否提供成功

 

 

 

利用zuul路由转发

 

 

 

1.6 zuul前缀

添加配置

zuul.prefix=/gg

 

(七)Gateway

1.1依赖spring-boot和spring webFlux,基于netty运行的网关.

 

1.2 简单使用,创建cloudgateway项目导入依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <relativePath/>
    </parent>

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 

1.3 配置路由转发

server.port=2001

spring.application.name=cloud-gateway
#spring.cloud.gateway.discovery.locator.enabled=true
# 服务名小写
spring.cloud.gateway.discovery.locator.lower-case-service-id=true
eureka.client.register-with-eureka=true
eureka.instance.prefer-ip-address=true
eureka-cloud-gateway
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

# id唯一
spring.cloud.gateway.routes[0].id=gateway-api
# 转发路由(lb://代表从注册中心获取服务)
spring.cloud.gateway.routes[0].uri=lb://eureka-client-user-service
# Path路由断言工厂
spring.cloud.gateway.routes[0].predicates[0]=Path=/house/**
# Query路由断言工厂(可用正则表达式) 断言
spring.cloud.gateway.routes[0].predicates[1]=Query=name, \\d+
#spring.cloud.gateway.routes[0].predicates[2]=Query=name1, \\w+
# Method路由断言工厂(忽略大小写)
spring.cloud.gateway.routes[0].predicates[2]=Method=get

 

1.4 添加主类

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

 

1.5 测试

开启eureka-server,eureka-client-user-service

 

访问8761端口

 

 

访问localhost:8081/house/data?name=3

 

接口提供成功

 

访问localhost:2001/house/data?name=3

 

posted @ 2021-04-25 11:14  G-G  阅读(331)  评论(0)    收藏  举报