SpringCloud

转载原文: https://segmentfault.com/a/1190000015804295

服务注册中心

1.新建项目名为eureka-server的Spring Boot项目, 并添加eureka server依赖,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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.beigege.cloud</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-server</name>
    <description>spring cloud学习</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <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>${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>
View Code
复制代码

2. EurekaServerApplication 类启用Eureka Server

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

3. application.properties配置Eureka Server

server.port: 8761 #服务端口
spring.application.name: eurka-server #服务应用名称

eureka.instance.hostname: localhost
eureka.client.registerWithEureka: false  #是否将自己注册到Eureka Server,默认为true
eureka.client.fetchRegistry: false       #是否从Eureka Server获取注册信息,默认为true
eureka.client.service-url.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #服务注册的URL

   registerWithEureka: false 和 fetchRegistry: false 来表明项目是一个 Eureka Server。

4.运行 EurekaServerApplication 类,启动项目,访问项目 http://localhost:8761, 即可查看当前注册中心的运行状态

服务提供者

1.新建项目名为eureka-client的Spring Boot项目,并添加euraka discovery和web依赖。

2. application.yml 设置euraka注册中心

server.port: 8762
spring.application.name: service-hi #服务之间的调用都是根据这个name   
eureka.client.service-url.defaultZone: http://localhost:8761/eureka/

3. 新建EurekaClientApplication类,提供 hi 服务

复制代码
@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaClientApplication {

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

    @Value("${server.port}")
    String port;

    @RequestMapping("/hi")
    public String home(@RequestParam(value = "name", defaultValue = "Lucy") String name) {
        return "hi " + name + ", I am from port:" + port;
    }
}
复制代码

4.启动 Eureka Server 和 Eureka Client 项目,访问http://localhost:8761 ,即eureka server 的网址:

Ribbon客户端

ribbon 在客户端实现了负载均衡。

1. 现在已经启动 一个Eureka Server [8761] 和 一个Eureka Client [8762],修改 Eureka Client 端口,再启动一个 Eureka Client 实例 [8763],相当于一个小的服务提供者集群,现在再访问eureka注册中心管理界面http://localhost:8761,可以看到已经注册两个service-hi实例。

2.新建一个 spring boot 工程,名称为 service-ribbon,创建过程和 eureka-client 一样,组件多选一个 Cloud Routing 下的 Ribbon,创建完成之后的 pom 文件依赖:

复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </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-hystrix</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
View Code
复制代码

3. application.properties 配置eureka注册中心地址

server.port: 8764  
spring.application.name: service-ribbon    
eureka.client.service-url.defaultZone: http://localhost:8761/eureka/

4. 新建ServiceRibbonApplication类,向 Spring 注入一个 restTemplate bean,并添加 @LoadBalanced 注解,表明这个 restTemplate 开启负载均衡功能:

复制代码
@SpringBootApplication
@EnableEurekaClient
@RestController
public class ServiceRibbonApplication { 
  public static void main(String[] args) { 
    SpringApplication.run(ServiceRibbonApplication.class, args); 
  }
  
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
@Autowired HelloService helloService; @RequestMapping(value
= "/hello") public String hello(@RequestParam String name){ return helloService.hello(name); } }
复制代码

5. 新建 HelloService类,来调用之前的 service-hi 服务的 /hi 接口,这里用服务名 SERVICE-HI 代替具体的 URL:

复制代码
@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;

    public String hello(String name) {
        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
    }
}
复制代码

6. 启动 service-ribbon 工程,多次访问该工程的 /hello 接口,即 localhost:8764/hello?name=test:

  hi test , I am from port:8762
  hi test , I am from port:8763

Feign

整合了 Ribbon,具有负载均衡的能力,整合了Hystrix,具有熔断的能力.

1.创建一个 spring boot工程,创建过程和 eureka-client 一样,多添加一个组件 Cloud Routing 下的 Feign,项目名叫 service-feign,创建完后的 pom 文件依赖:

复制代码
        <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-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
View Code
复制代码

2. application.properties 配置文件:

server.port: 8765
spring.application.name: service-feign
eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/

3. 新建ServiceFeignApplication类

复制代码
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class SericeFeignApplication {

    public static void main(String[] args) {
        SpringApplication.run(SericeFeignApplication.class, args);
    }
}
复制代码

4.写一个 SchedualService接口,通过@ FeignClient(“服务名”),来指定调用哪个服务,@GetMapping("接口名"),来向接口发送 Get 请求:

复制代码
@FeignClient(value = "service-hi")
public interface SchedualService {

    @GetMapping("/hello")
    String sayHello(@RequestParam(value = "name") String name);    
}

@RestController
public class HiController {
    
    @Autowired
    SchedualService schedualService;

    @GetMapping(value = "/hello")
    public String sayHi(@RequestParam String name) {
        return schedualService.sayHello( name );
    }
}
复制代码

5.启动 service-feign,访问localhost:8765/hello?name=test 测试,下面交替显示,说明实现了负载均衡:

  hi test ,i am from port:8762 
  hi test ,i am from port:8763

断路器 - Hystrix

ribbon + Hystrix

1.在 pom 文件中加入 Hystrix 依赖:

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

2.在程序的启动类 ServiceRibbonApplication 加 @EnableHystrix 注解开启Hystrix:

复制代码
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
public class ServiceRibbonApplication {
    public static void main(String[] args) {
        SpringApplication.run( ServiceRibbonApplication.class, args );
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
复制代码

3.添加熔断方法,改造 HelloService 类,在 hello方法上面添加 @HystrixCommand 注解,fallbackMethod 是熔断方法,当服务不可用时会执行 hiError 方法:

复制代码
@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "hiError")
    public String hello(String name) {
        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
    }

    public String hiError(String name) {
        return "hi,"+name+",sorry for the error!";
    }
}
复制代码

4. 重启 service-ribbon,访问 localhost:8764/hi?name=test

   hi test ,i am from port:8763

5. 关闭两个 eureka-client 实例,在访问 localhost:8764/hi?name=test,浏览器显示:

   hi,test,sorry for the error!

   当服务不可用时,断路器会迅速执行熔断方法。

feign + Hystrix

1.Feign 自带断路器,在低版本的Spring Cloud之后,它没有默认打开。需要在配置文件中配置打开:

feign.hystrix.enabled: true

2.在请求接口指定熔断实现类,fallback 指定熔断实现类:

@FeignClient(value ="service-hi",fallback = SchedualServiceHiHystric.class)
public interface SchedualServiceHi {
    
    @GetMapping("/hello")
    String sayHello(@RequestParam(value = "name") String name);

}

 

posted @   安小  阅读(222)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示