{"id":20661461,"url":"https://github.com/pibigstar/spring-cloud-demo","last_synced_at":"2026-04-24T13:01:21.056Z","repository":{"id":94921281,"uuid":"158055632","full_name":"pibigstar/spring-cloud-demo","owner":"pibigstar","description":"学习SpringCloud示例","archived":false,"fork":false,"pushed_at":"2018-11-23T05:38:32.000Z","size":164,"stargazers_count":1,"open_issues_count":8,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-03-10T04:47:42.755Z","etag":null,"topics":["feign","springboot","springcloud"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pibigstar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-18T06:14:07.000Z","updated_at":"2018-11-23T05:38:34.000Z","dependencies_parsed_at":null,"dependency_job_id":"eb79582f-88fd-4389-b5f4-6d66307009a0","html_url":"https://github.com/pibigstar/spring-cloud-demo","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pibigstar/spring-cloud-demo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pibigstar%2Fspring-cloud-demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pibigstar%2Fspring-cloud-demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pibigstar%2Fspring-cloud-demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pibigstar%2Fspring-cloud-demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pibigstar","download_url":"https://codeload.github.com/pibigstar/spring-cloud-demo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pibigstar%2Fspring-cloud-demo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32224413,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T10:26:35.452Z","status":"ssl_error","status_checked_at":"2026-04-24T10:25:27.643Z","response_time":64,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["feign","springboot","springcloud"],"created_at":"2024-11-16T19:09:46.725Z","updated_at":"2026-04-24T13:01:21.037Z","avatar_url":"https://github.com/pibigstar.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SpringCloud 学习例子\r\n[![Build Status](https://travis-ci.org/pibigstar/spring-cloud-demo.svg?branch=master)](https://travis-ci.org/pibigstar/spring-cloud-demo)\r\n\r\n通过分支来对项目归类，详情可通过Issue查看每个分支具体内容\r\n\r\n- feat-1: 使用ribbon+restTemplate方式消费服务\r\n- feat-2: 使用feign方式消费服务\r\n- feat-3: 在feign方式中使用熔断器（hystrix）\r\n- feat-4: 使用Zuul实现路由转发功能\r\n- feat-5: 配置文件服务器(config-server)\r\n- feat-6: 配置高可用（带注册中心）文件服务器(config-server)\r\n- feat-7: 使用消息总线rabbitMq\r\n- feat-8: 使用zipkin进行服务监控与追踪\r\n\r\n## 服务的注册和发现\r\n\r\n#### 使用\r\n\r\n##### 1. 创建服务注册中心\r\n1. 添加依赖\r\n```xml\r\n\u003cdependency\u003e\r\n\t\u003cgroupId\u003eorg.springframework.cloud\u003c/groupId\u003e\r\n\t\u003cartifactId\u003espring-cloud-starter-eureka-server\u003c/artifactId\u003e\r\n\u003c/dependency\u003e\r\n```\r\n2. 新增配置\r\n```yaml\r\nserver:\r\n  port: 8080\r\neureka:\r\n  instance:\r\n    hostname: localhost\r\n  client:\r\n    registerWithEureka: false\r\n    fetchRegistry: false\r\n    serviceUrl:\r\n      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/\r\n```\r\n3. 添加注解\r\n```java\r\n@EnableEurekaServer // 启动一个注册中心\r\n@SpringBootApplication\r\npublic class EurekaserverApplication {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tSpringApplication.run(EurekaserverApplication.class, args);\r\n\t}\r\n}\r\n```\r\n\r\n##### 2. 创建一个服务提供者\r\n1. 添加依赖\r\n```xml\r\n\u003cdependency\u003e\r\n\t\u003cgroupId\u003eorg.springframework.cloud\u003c/groupId\u003e\r\n\t\u003cartifactId\u003espring-cloud-starter-eureka\u003c/artifactId\u003e\r\n\u003c/dependency\u003e\r\n```\r\n2. 添加配置\r\n```yaml\r\nserver:\r\n  port: 8701\r\n\r\nspring:\r\n  application:\r\n    name: service-hello  # 服务名\r\n\r\neureka:\r\n  client:\r\n    serviceUrl:\r\n      defaultZone: http://localhost:8080/eureka/  # 注册中心地址\r\n```\r\n3. 添加注解\r\n```java\r\n@SpringBootApplication\r\n// 设置为Eureka客户端\r\n@EnableEurekaClient\r\n@RestController\r\npublic class ServiceHelloApplication {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tSpringApplication.run(ServiceHelloApplication.class, args);\r\n\t}\r\n\t@Value(\"${server.port}\")\r\n\tString port;\r\n\r\n\t@RequestMapping(\"/hello\")\r\n\tpublic String home(@RequestParam(value = \"name\", defaultValue = \"forezp\") String name) {\r\n\t\treturn \"hi \" + name + \" ,i am from port:\" + port;\r\n\t}\r\n}\r\n```\r\n\r\n## feat-1 使用ribbon+restTemplate方式消费服务\r\n\u003e在微服务架构中，业务都会被拆分成一个独立的服务，服务与服务的通讯是基于http restful的。\r\nSpring cloud有两种服务调用方式，一种是ribbon+restTemplate，另一种是feign。首先讲解下基于ribbon+rest。\r\n\r\nribbon是一个负载均衡客户端，可以很好的控制htt和tcp的一些行为。Feign默认集成了ribbon。\r\n\r\n- eureka-server: 注册中心\r\n- service-hello: 服务提供者\r\n- service-ribbon: 服务消费者\r\n\r\n在浏览器上多次访问http://localhost:8801/hello?name=pibigstar，浏览器交替显示：\r\n```\r\nhi pibigstar,i am from port:8701\r\nhi pibigstar,i am from port:8702\r\n```\r\n**核心:**\r\n当我们通过调用restTemplate.getForObject(“http://service-hello/hello?name=”+name,String.class)方法时，已经做了负载均衡，访问了不同的端口的服务实例。\r\n\r\n[点击查看详情](https://blog.csdn.net/forezp/article/details/81040946)\r\n\r\n##### 1. 创建一个服务消费者\r\n1. 添加依赖\r\n```xml\r\n\u003cdependency\u003e\r\n   \u003cgroupId\u003eorg.springframework.cloud\u003c/groupId\u003e\r\n   \u003cartifactId\u003espring-cloud-starter-netflix-eureka-client\u003c/artifactId\u003e\r\n\u003c/dependency\u003e\r\n\u003cdependency\u003e\r\n    \u003cgroupId\u003eorg.springframework.cloud\u003c/groupId\u003e\r\n    \u003cartifactId\u003espring-cloud-starter-netflix-ribbon\u003c/artifactId\u003e\r\n\u003c/dependency\u003e\r\n\r\n```\r\n2. 添加配置\r\n```yaml\r\nserver:\r\n  port: 8801\r\n\r\neureka:\r\n  client:\r\n    service-url:\r\n      defaultZone: http://localhost:8080/eureka/  # 注册中心地址\r\n\r\nspring:\r\n  application:\r\n    name: service-ribbon\r\n```\r\n3. 添加注解\r\n```java\r\n@SpringBootApplication\r\n@EnableEurekaClient     // 让注册中心找到此客户端\r\n@EnableDiscoveryClient  // 向服务中心注册\r\npublic class ServiceRibbonApplication {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tSpringApplication.run(ServiceRibbonApplication.class, args);\r\n\t}\r\n\r\n\t@Bean\r\n\t@LoadBalanced //表明这个restRemplate开启负载均衡的功能。\r\n\tRestTemplate restTemplat(){\r\n\t\treturn new RestTemplate();\r\n\t}\r\n}\r\n```\r\n\r\n## feat-2 使用feign方式消费服务\r\n\u003e Feign是一个声明式的伪Http客户端，它使得写Http客户端变得更简单。 使用Feign，只需要创建一个接口并注解。它具有可插拔的注解特性， 可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。 Feign默认集成了Ribbon，并和Eureka结合，默认实现了负载均衡的效果。\r\n\r\n简而言之：\r\n\r\n- Feign 采用的是基于接口的注解\r\n- Feign 整合了ribbon，具有负载均衡的能力\r\n- 整合了Hystrix，具有熔断的能力\r\n\r\n#### 使用\r\n\r\n1. 添加依赖\r\n```xml\r\n\u003cdependency\u003e\r\n   \u003cgroupId\u003eorg.springframework.cloud\u003c/groupId\u003e\r\n   \u003cartifactId\u003espring-cloud-starter-netflix-eureka-client\u003c/artifactId\u003e\r\n\u003c/dependency\u003e\r\n\u003cdependency\u003e\r\n   \u003cgroupId\u003eorg.springframework.cloud\u003c/groupId\u003e\r\n   \u003cartifactId\u003espring-cloud-starter-openfeign\u003c/artifactId\u003e\r\n\u003c/dependency\u003e\r\n```\r\n2. 添加配置\r\n```yaml\r\nserver:\r\n  port: 8802\r\nspring:\r\n  application:\r\n    name: service-feign\r\neureka:\r\n  client:\r\n    service-url:\r\n      defaultZone: http://localhost:8080/eureka/\r\n```\r\n3. 添加注解\r\n```java\r\n@SpringBootApplication\r\n@EnableEurekaClient\r\n@EnableDiscoveryClient\r\n@EnableFeignClients  //开启Feign的功能\r\npublic class ServiceFeignApplication {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tSpringApplication.run(ServiceFeignApplication.class, args);\r\n\t}\r\n}\r\n```\r\n4. 调用服务\r\n```java\r\n@FeignClient(value = \"service-hello\", fallback = HelloServiceHystrix.class)\r\npublic interface IHelloService {\r\n    @GetMapping(value = \"/hello\")\r\n    String sayHelloFromFeignClient(@RequestParam(value = \"name\") String name);\r\n}\r\n```\r\n\r\n## feat-3 feign方式使用熔断器（hystrix）\r\n\u003e 由于网络原因或者自身的原因，服务并不能保证100%可用，如果单个服务出现问题，调用这个服务就会出现线程阻塞，此时若有大量的请求涌入，Servlet容器的线程资源会被消耗完毕，导致服务瘫痪。服务与服务之间的依赖性，故障会传播，会对整个微服务系统造成灾难性的严重后果，这就是服务故障的“雪崩”效应。\r\n\r\n断路打开后，可用避免连锁故障，fallback方法可以直接返回一个固定值。\r\n\r\n#### Feign中使用熔断器\r\n1. 打开配置文件\r\n```yaml\r\nfeign:\r\n  hystrix:\r\n    enabled: true\r\n```\r\n2. 创建服务无法调用成功时的处理器\r\n需要实现IHelloService 接口，并注入到Ioc容器中\r\n```java\r\n@Component\r\npublic class HelloServiceHystrix implements IHelloService{\r\n    @Override\r\n    public String sayHelloFromFeignClient(String name) {\r\n        return \"this is have a error, sorry:\" + name;\r\n    }\r\n}\r\n```\r\n3. 调用服务时设置熔断器\r\n```java\r\n@FeignClient(value = \"service-hello\", fallback = HelloServiceHystrix.class)\r\n```\r\n\r\n\r\n## feat-4 使用Zuul实现路由转发功能\r\n\u003e Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分，\r\n比如／api/user转发到到user服务，/api/shop转发到到shop服务。\r\nzuul默认和Ribbon结合实现了负载均衡的功能。\r\n\r\n\r\n#### feign使用Zuul\r\n\r\n1. 添加依赖\r\n```xml\r\n        \u003cdependency\u003e\r\n            \u003cgroupId\u003eorg.springframework.cloud\u003c/groupId\u003e\r\n            \u003cartifactId\u003espring-cloud-starter-netflix-zuul\u003c/artifactId\u003e\r\n        \u003c/dependency\u003e\r\n```\r\n2. 配置路由\r\n```yaml\r\nzuul:\r\n  routes:\r\n    api-a:\r\n      path: /api-a/*\r\n      serviceId: service-feign\r\n    api-b:\r\n      path: /api-b/*\r\n      serviceId: service-feign\r\n```\r\n3. 启动类中开启路由转发\r\n```java\r\n@SpringBootApplication\r\n@EnableEurekaClient\r\n@EnableDiscoveryClient\r\n@EnableZuulProxy // 开启路由代理\r\npublic class ServiceZuulApplication {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tSpringApplication.run(ServiceZuulApplication.class, args);\r\n\t}\r\n}\r\n```\r\n\r\n#### 浏览器中调用\r\n通过不同的地址调用不同的服务\r\n\r\nhttp://localhost:8803/api-a/hello?name=pibigstar\r\n\r\nhttp://localhost:8803/api-b/hello?name=pibigstar\r\n\r\n\r\n#### 服务过滤\r\n\r\n1. filterType：返回一个字符串代表过滤器的类型，在zuul中定义了四种不同生命周期的过滤器类型，具体如下：\r\n- pre：路由之前\r\n- routing：路由之时\r\n- post： 路由之后\r\n- error：发送错误调用\r\n2. filterOrder：过滤的顺序\r\n3. shouldFilter：这里可以写逻辑判断，是否要过滤，本文true,永远过滤。\r\n4. run：过滤器的具体逻辑。可用很复杂，包括查sql，nosql去判断该请求到底有没有权限访问\r\n\r\n\r\n## feat-6 配置高可用文件服务器(config-server)\r\n\u003e 使用配置服务来保存各个服务的配置文件\r\n\r\n1. 添加依赖\r\n```xml\r\n\u003cdependency\u003e\r\n\t\u003cgroupId\u003eorg.springframework.cloud\u003c/groupId\u003e\r\n\t\u003cartifactId\u003espring-cloud-config-server\u003c/artifactId\u003e\r\n\u003c/dependency\u003e\r\n```\r\n2. 打开配置服务功能\r\n```java\r\n@SpringBootApplication\r\n@EnableConfigServer // 开启配置服务器功能\r\npublic class ConfigServerApplication {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tSpringApplication.run(ConfigServerApplication.class, args);\r\n\t}\r\n}\r\n```\r\n3. 设置配置文件\r\n```yaml\r\nserver:\r\n  port: 8081\r\nspring:\r\n  application:\r\n    name: config-server\r\n\r\n  # 配置配置文件地址\r\n  cloud:\r\n    config:\r\n      default-label: feat-5  # 设置分支\r\n      server:\r\n        git:\r\n          # git仓库地址\r\n          uri: ://github.com/pibigstar/spring-cloud-demo\r\n          # 配置仓库下的路径\r\n          search-paths: spring-cloud-config\r\n          # 配置仓库用户名\r\n          username:\r\n          # 配置仓库密码\r\n          password:\r\n```\r\n\r\n## 从配置服务器中读取配置(config-client)\r\n\r\n1. 添加依赖\r\n\r\n```xml\r\n\u003cdependency\u003e\r\n\t\u003cgroupId\u003eorg.springframework.cloud\u003c/groupId\u003e\r\n\t\u003cartifactId\u003espring-cloud-starter-config\u003c/artifactId\u003e\r\n\u003c/dependency\u003e\r\n```\r\n2. 配置配置文件\r\n\r\n必须是这个名字，不然不是报错，就是拿不到信息\r\n\r\n**bootstrap.properties** \r\n```properties\r\nserver.port=8901\r\nspring.application.name=config-client\r\n\r\n# 配置服务器服务中心地址\r\nspring.cloud.config.uri=http://localhost:8081/\r\nspring.cloud.config.label=feat-5\r\nspring.cloud.config.profile=dev\r\n\r\n#dev开发环境配置文件\r\n#test测试环境\r\n#pro正式环境\r\n```\r\n3. 使用\r\n\r\n```java\r\n@Value(\"${name}\")\r\nprivate String name;\r\n@Value(\"${message}\")\r\nprivate String message;\r\n```\r\n## feat-8: 使用zipkin进行服务监控与追踪\r\n\r\n### 使用\r\n1. 下载zipkin架包\r\n\r\n[点击下载](https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/)\r\n\r\n启动zipkin：\r\n```java\r\njava -jar zipkin-server-2.11.8-exec.jar\r\n```\r\n浏览器访问：http://localhost:9411 如果能正常打开，则证明启动成功\r\n\r\n2. 添加依赖\r\n```xml\r\n\u003cdependency\u003e\r\n   \u003cgroupId\u003eorg.springframework.cloud\u003c/groupId\u003e\r\n   \u003cartifactId\u003espring-cloud-starter-zipkin\u003c/artifactId\u003e\r\n\u003c/dependency\u003e\r\n```\r\n3. 添加配置\r\n\r\n```yaml\r\nspring:\r\n  zipkin:\r\n    base-url: http://localhost:9411\r\n```\r\n**注意：** 一定要先访问下项目的接口，不然在Zipkin中是监控不到的，只能监控访问过的接口\r\n\r\n\r\n\r\n\r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpibigstar%2Fspring-cloud-demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpibigstar%2Fspring-cloud-demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpibigstar%2Fspring-cloud-demo/lists"}