@Service public class UserService { @Autowired private LoadBalancerClient loadBalancerClient;//ribbon 负 载均衡器 public List<User> getUsers(){ //选择调用的服务的名称 //ServiceInstance 封装了服务的基本信息,如 IP,端口 ServiceInstance si = this.loadBalancerClient.choose("eureka-provider"); //拼接访问服务的 URL StringBuffer sb = new StringBuffer(); //http://localhost:9090/user sb.append("http://").append(si.getHost()).append(":").appen d(si.getPort()).append("/user"); System.out.println(sb.toString()); //springMVC RestTemplate RestTemplate rt = new RestTemplate(); ParameterizedTypeReference<List<User>> type = new ParameterizedTypeReference<List<User>>() {}; //ResponseEntity:封装了返回值信息 ResponseEntity<List<User>> response = rt.exchange(sb.toString(),HttpMethod.GET, null, type); List<User> list =response.getBody(); return list; } }
spring.application.name=eureka-consumer server.port=9091 #设置服务注册中心地址,指向另一个注册中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eur eka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/
#!/bin/bash cd `dirname $0` CUR_SHELL_DIR=`pwd` CUR_SHELL_NAME=`basename ${BASH_SOURCE}` JAR_NAME="springcloud-eureka-provider-0.0.1-SNAPSHOT.jar" JAR_PATH=$CUR_SHELL_DIR/$JAR_NAME #JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:PermSize=128m" JAVA_MEM_OPTS="" #SPRING_PROFILES_ACTIV="-Dspring.profiles.active=eureka2" SPRING_PROFILES_ACTIV="" LOG_DIR=$CUR_SHELL_DIR/logs LOG_PATH=$LOG_DIR/${JAR_NAME%..log echo_help() { echo -e "syntax: sh $CUR_SHELL_NAME start|stop" } if [ -z $1 ];then echo_help exit 1 fi if [ ! -d "$LOG_DIR" ];then mkdir "$LOG_DIR" fi if [ ! -f "$LOG_PATH" ];then touch "$LOG_DIR" fi if [ "$1" == "start" ];then # check server PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk ‘{print $2}‘` if [ -n "$PIDS" ]; then echo -e "ERROR: The $JAR_NAME already started and the PID is ${PIDS}." exit 1 fi echo "Starting the $JAR_NAME..." # start nohup java $JAVA_MEM_OPTS -jar $SPRING_PROFILES_ACTIV $JAR_PATH >> $LOG_PATH 2>&1 & COUNT=0 while [ $COUNT -lt 1 ]; do sleep 1 COUNT=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk ‘{print $2}‘ | wc -l` if [ $COUNT -gt 0 ]; then break fi done PIDS=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk ‘{print $2}‘` echo "${JAR_NAME} Started and the PID is ${PIDS}." echo "You can check the log file in ${LOG_PATH} for details." elif [ "$1" == "stop" ];then PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk ‘{print $2}‘` if [ -z "$PIDS" ]; then echo "ERROR:The $JAR_NAME does not started!" exit 1 fi echo -e "Stopping the $JAR_NAME..." for PID in $PIDS; do kill $PID > /dev/null 2>&1 done COUNT=0 while [ $COUNT -lt 1 ]; do sleep 1 COUNT=1 for PID in $PIDS ; do PID_EXIST=`ps --no-heading -p $PID` if [ -n "$PID_EXIST" ]; then COUNT=0 break fi done done echo -e "${JAR_NAME} Stopped and the PID is ${PIDS}." else echo_help exit 1 fi
@EnableEurekaClient @SpringBootApplication public class ConsumerApplication { 7 区域敏感性策略 ZoneAvoidanceRule: 1.以一个区域为单位考察可 用性,对于不可用的区域整个丢 弃,从剩下区域中选可用的 provider 2.如果这个 ip 区域内有一个或多 个实例不可达或响应变慢,都会降 低该 ip 区域内其他 ip 被选中的权 重。 @Bean public RandomRule createRule(){ return new RandomRule(); } public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
#设置负载均衡策略 eureka-provider 为调用的服务的名称 eureka-provider.ribbon.NFLoadBalancerRuleClassName=com.netf lix.loadbalancer.RandomRule
<!-- ribbon 坐标 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
spring.application.name=eureka-consumer-LB server.port=9091 #禁用 eureka ribbon.eureka.enabled=false #指定具体的服务实例清单 eureka-provider.ribbon.listOfServers=192.168.70.137:9090
@SpringBootApplication public class ConsumerApplication { /*@Bean public RandomRule createRule(){ return new RandomRule(); }*/ public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
<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.bjsxt</groupId> <artifactId>springcloud-ego-product-service</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEn coding> <project.reporting.outputEncoding>UTF-8</project.reporting. outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <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-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies> </project>
/** * Product 服务接口 * @author Administrator * */ @RequestMapping("/product") public interface ProductService { //查询所有商品 @RequestMapping(value="/findAll",method=RequestMethod.GE T) public List<Product> findAll(); }
public class Product { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Product(Integer id, String name) { super(); this.id = id; this.name = name; } public Product() { super(); // TODO Auto-generated constructor stub } }
<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.bjsxt</groupId> <artifactId>springcloud-ego-product-provider</artifactId > <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEn coding> <project.reporting.outputEncoding>UTF-8</project.reporting. outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <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-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!-- 添加 product-service 坐标 --> <dependency> <groupId>com.bjsxt</groupId> <artifactId>springcloud-ego-product-service</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
spring.application.name=ego-product-provider server.port=9001 #设置服务注册中心地址,指向另一个注册中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eur eka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/
/** * Product-Provider 服务 * @author Administrator * */ @RestController public class ProductController implements ProductService { @Override public List<Product> findAll() { List<Product> list = new ArrayList<>(); list.add(new Product(1, "电视")); list.add(new Product(2, "电脑")); list.add(new Product(3, "冰箱")); list.add(new Product(4, "手电筒")); return list; } }
@EnableEurekaClient @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
<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.bjsxt</groupId> <artifactId>springcloud-ego-product-consumer</artifactId > <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEn coding> <project.reporting.outputEncoding>UTF-8</project.reporting. outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <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-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!-- 添加 Feign 坐标 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <!-- 添加 product-service 坐标 --> <dependency> <groupId>com.bjsxt</groupId> <artifactId>springcloud-ego-product-service</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
spring.application.name=ego-product-consumer server.port=9002 #设置服务注册中心地址,指向另一个注册中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eur eka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/
/** * Product Consumer 服务 * @author Administrator * */ @RestController public class ProductController { @Autowired ProductConsumerService consumerservice; /** * Consumer 中的查询所有商品的方法 * @return */ @RequestMapping(value="/list",method=RequestMethod.GET) public List<Product> getAll(){ return this.consumerservice.findAll(); } }
@FeignClient(name="ego-product-provider") public interface ProductConsumerService extends ProductService{ }
@EnableFeignClients @EnableDiscoveryClient @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
/** * Product 服务接口 * @author Administrator * */ @RequestMapping("/product") public interface ProductService { //查询所有商品 @RequestMapping(value="/findAll",method=RequestMethod.GE T) public List<Product> findAll(); //根据商品 ID 查询商品 @RequestMapping(value="/getProductById",method=RequestMe thod.GET) public Product getProductById(@RequestParam("id") Integer id); }
/** * Product-Provider 服务 * @author Administrator * */ @RestController public class ProductController implements ProductService { @Override public List<Product> findAll() { List<Product> list = new ArrayList<>(); list.add(new Product(1, "电视")); list.add(new Product(2, "电脑")); list.add(new Product(3, "冰箱")); list.add(new Product(4, "手电筒")); return list; } @Override public Product getProductById(Integer id) { return new Product(id, "SpringCloud"); } }
/** * Product Consumer 服务 * @author Administrator * */ @RestController public class ProductController { @Autowired ProductConsumerService consumerservice; /** * Consumer 中的查询所有商品的方法 * @return */ @RequestMapping(value="/list",method=RequestMethod.GET) public List<Product> getAll(){ return this.consumerservice.findAll(); } /** * Consumer 中根据商品 id 查询商品 */ @RequestMapping(value="/get",method=RequestMethod.GET) public Product getProduct(@RequestParam("id") Integer id){ return this.consumerservice.getProductById(id); } }
/** * Product 服务接口 * @author Administrator * */ @RequestMapping("/product") public interface ProductService { //查询所有商品 @RequestMapping(value="/findAll",method=RequestMethod.GE T) public List<Product> findAll(); //根据商品 ID 查询商品 @RequestMapping(value="/getProductById",method=RequestMe thod.GET) public Product getProductById(@RequestParam("id") Integer id); //添加商品传递多个参数 方式一 :GET 方式 @RequestMapping(value="/add",method=RequestMethod.GET) public Product addProduct(@RequestParam("id") Integer id,@RequestParam("name") String name); }
/** * Product-Provider 服务 * @author Administrator * */ @RestController public class ProductController implements ProductService { @Override public List<Product> findAll() { List<Product> list = new ArrayList<>(); list.add(new Product(1, "电视")); list.add(new Product(2, "电脑")); list.add(new Product(3, "冰箱")); list.add(new Product(4, "手电筒")); return list; } @Override public Product getProductById(Integer id) { return new Product(id, "SpringCloud"); } @Override public Product addProduct(Integer id, String name) { return new Product(id, name); }
/** * Product Consumer 服务 * @author Administrator * */ @RestController public class ProductController { @Autowired ProductConsumerService consumerservice; /** * Consumer 中的查询所有商品的方法 * @return */ @RequestMapping(value="/list",method=RequestMethod.GET) public List<Product> getAll(){ return this.consumerservice.findAll(); } /** * Consumer 中根据商品 id 查询商品 */ @RequestMapping(value="/get",method=RequestMethod.GET) public Product getProduct(@RequestParam("id") Integer id){ return this.consumerservice.getProductById(id); } /** * 商品添加 传递多个参数。方式一:GET */ @RequestMapping(value="/add",method=RequestMethod.GET) public Product addProduct(Product product){ return this.consumerservice.addProduct(product.getId(), product.getName()); } }
/** * Product 服务接口 * @author Administrator * */ @RequestMapping("/product") public interface ProductService { //查询所有商品 @RequestMapping(value="/findAll",method=RequestMethod.GE T) public List<Product> findAll(); //根据商品 ID 查询商品 @RequestMapping(value="/getProductById",method=RequestMe thod.GET) public Product getProductById(@RequestParam("id") Integer id); //添加商品传递多个参数 方式一 :GET 方式 @RequestMapping(value="/add",method=RequestMethod.GET) public Product addProduct(@RequestParam("id") Integer id,@RequestParam("name") String name); //添加商品传递多个参数 方式二 :POST 方式 @RequestMapping(value="/add",method=RequestMethod.POST) public Product addProduct2(@RequestBody Product product); }
/** * Product-Provider 服务 * @author Administrator * */ @RestController public class ProductController implements ProductService { @Override public List<Product> findAll() { List<Product> list = new ArrayList<>(); list.add(new Product(1, "电视")); list.add(new Product(2, "电脑")); list.add(new Product(3, "冰箱")); list.add(new Product(4, "手电筒")); return list; } @Override public Product getProductById(Integer id) { return new Product(id, "SpringCloud"); } @Override public Product addProduct(Integer id, String name) { return new Product(id, name); } @Override public Product addProduct2(@RequestBody Product product) { return product; } }
/** * Product Consumer 服务 * @author Administrator * */ @RestController public class ProductController { @Autowired ProductConsumerService consumerservice; /** * Consumer 中的查询所有商品的方法 * @return */ @RequestMapping(value="/list",method=RequestMethod.GET) public List<Product> getAll(){ return this.consumerservice.findAll(); } /** * Consumer 中根据商品 id 查询商品 */ @RequestMapping(value="/get",method=RequestMethod.GET) public Product getProduct(@RequestParam("id") Integer id){ return this.consumerservice.getProductById(id); } /** * 商品添加 传递多个参数。方式一:GET */ @RequestMapping(value="/add",method=RequestMethod.GET) public Product addProduct(Product product){ return this.consumerservice.addProduct(product.getId(), product.getName()); } /** * 商品添加 传递多个参数。方式二:POST */ @RequestMapping(value="/add2",method=RequestMethod.GET) public Product addProduct2(Product product){ return this.consumerservice.addProduct2(product); } }
#-----------------------------feign gzip #配置请求 GZIP 压缩 feign.compression.request.enabled=true #配置响应 GZIP 压缩 feign.compression.response.enabled=true #配置压缩支持的 MIME TYPE feign.compression.request.mime-types=text/xml,application/x ml,application/json #配置压缩数据大小的最小阀值,默认 2048 feign.compression.request.min-request-size=512
#-----------------------------spring boot gzip #是否启用压缩 server.compression.enabled=true server.compression.mime-types=application/json,application/ xml,text/html,text/xml,text/plain
<!-- 使用Apache HttpClient替换Feign原生httpURLConnection --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> <dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-httpclient</artifactId> <version>8.17.0</version> </dependency>
/** * Product 服务接口* @author Administrator * */ @RequestMapping("/product") public interface ProductService { //查询所有商品 @RequestMapping(value="/findAll",method=RequestMethod.GE T) public List<Product> findAll(); //根据商品 ID 查询商品 @RequestMapping(value="/getProductById",method=RequestMe thod.GET) public Product getProductById(@RequestParam("id") Integer id); //添加商品传递多个参数 方式一 :GET 方式 @RequestMapping(value="/add",method=RequestMethod.GET) public Product addProduct(@RequestParam("id") Integer id,@RequestParam("name") String name); //----------------------Httpclient---------------------- ------------------------ //添加商品传递多个参数 方式二 :POST 方式 @RequestMapping(value="/add2",method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE) public Product addProduct2(@RequestBody Product product); //使用 HttpClient 工具 添加商品传递多个参数 :基于 GET 方式 @RequestMapping(value="/add3",method=RequestMethod.GET,c onsumes=MediaType.APPLICATION_JSON_VALUE) public Product addProduct3(Product product); }
<!-- 日志输出级别 --> <root level="DEBUG"> <appender-ref ref="Stdout" /> <appender-ref ref="RollingFile" /> </root>
@EnableFeignClients @EnableDiscoveryClient @SpringBootApplication public class ConsumerApplication { // NONE:不记录任何信息,默认值 // BASIC:记录请求方法、请求 URL、状态码和用时 // HEADERS:在 BASIC 基础上再记录一些常用信息 // FULL:记录请求和相应的所有信息 @Bean public Logger.Level getLog(){ return Logger.Level.FULL; } public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
#全局配置 # 请求连接的超时时间 默认的时间为 1 秒 ribbon.ConnectTimeout=5000 # 请求处理的超时时间 ribbon.ReadTimeout=5000
#局部配置 # 对所有操作请求都进行重试 ego-product-provider.ribbon.OkToRetryOnAllOperations=true # 对当前实例的重试次数 ego-product-provider.ribbon.MaxAutoRetries=2 # 切换实例的重试次数 ego-product-providert.ribbon.MaxAutoRetriesNextServer=0 # 请求连接的超时时间 ego-product-provider.ribbon.ConnectTimeout=3000 # 请求处理的超时时间 ego-product-provider.ribbon.ReadTimeout=3000
原文:https://www.cnblogs.com/wq-9/p/12124815.html