Ribbon 调用
负载均衡算法
- 轮循算法
启动两个userService服务
- 注意:当无法同时运行两个main方法的时候,如下操作
点击进入第一个选项
右上角把这里的√全部取消掉之后点apply执行
设置两个不同的端口
server:
port: 8881
server:
port: 8882
controller类中可以随便添加一个方法测试
@GetMapping("/a")
public String a(){
return "1";
}
- 运行userview服务
在controller类中添加一个方法调用
@Autowired
RestTemplate rt;
@GetMapping("/a")
public String a(){
String url="http://USERSERVICE/a";
String forObject = rt.getForObject(url, String.class);
return forObject;
}
-
实现以下情况 ,轮流循环1和2
-
随机算法(RandomRule)
在userview的main方法的类中添加一个Bean
重新运行,即可去看效果
-
在这里也可以自己定义一个rule类,按照自己的规则去定义
-
注意:创建一个在main方法子类或则同层级的类,否则无法扫描到,还有不要添加任何注解
需要extends AbstractLoadBalancerRule类,在实现重写
public class MyRule extends AbstractLoadBalancerRule {
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
@Override
public Server choose(Object o) {
ILoadBalancer loadBalancer = this.getLoadBalancer();
List<Server> reachableServers =loadBalancer.getReachableServers();
return reachableServers.get(0);
}
}
简单的实现了永远执行第一台服务service;快去试试自己 的规则吧!
- 注意:这样定义的规则是针对所有人调用的,当微服务多的时候,或者调用其他微服务的时候,会出现一些问题
所以需要去yml配置中添加 —谁需要掉用就写谁的
#微服务的名称
USERSERVICE:
ribbon:
NFLoadBalancerRuleClassName: rule.MyRule
当如果都需要的时候就在main方法添加个bean
Feign调用
这里在userservice中的controller层添加了一个类,取名就叫Empcontroller,这里就用rest风格去实现
@RestController
public class EmpController {
@GetMapping("/emp/{id}")
//@PathVariable 获取路劲参数
public Emp queryEmp(@PathVariable String id){
Emp emp=new Emp();
emp.setId(id);
emp.setName("张三******"+id);
return emp;
}
@PostMapping("/emp")
public Result add(@RequestBody Emp emp){
Result result=new Result();
result.setCode(1);
result.setMsg(emp.getId()+"----"+emp.getName());
return result;
}
@DeleteMapping("/emp/{id}")
public Result del(@PathVariable String id){
Result result=new Result();
result.setCode(1);
result.setMsg(id);
return result;
}
@PutMapping("/emp/{id}")
public Result update(@PathVariable String id,@RequestBody Emp emp){
Result result=new Result();
result.setCode(1);
result.setMsg("修改成功");
return result;
}
}
新建了一个新的微服务,entity 可以从上面复制,yml也直接复制就好,不需要改动
- 注意userviewF中需要多添加一个属于Feign的注解@EnableFeignClients
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@RestController
public class UserViewF {
public static void main(String[] args) {
new SpringApplicationBuilder(UserViewF.class).web(true).run(args);
}
}
- 因为feign是面向接口编程,所以添加个接口类,注意注解@FeignClient(name=“连接的服务名”)
@FeignClient(name="USERSERVICE")
public interface EmpFeign {
@GetMapping("/emp/{id}")
//@PathVariable 获取路劲参数
public Emp queryEmp(@PathVariable("id") String id);
@PostMapping("/emp")
public Result add(Emp emp);
@DeleteMapping("/emp/{id}")
public Result del(@PathVariable("id") String id);
@PutMapping("/emp/{id}")
public Result update(@PathVariable("id") String id,@RequestBody Emp emp);
}
@RestController
public class EmpController {
@Autowired
EmpFeign ef;
@GetMapping("/query")
public Emp queryEmp(){
String id="1";
Emp emp=ef.queryEmp(id);
return emp;
}
@GetMapping("/add")
public Result add(Emp emp){
Result add = ef.add(emp);
return add;
}
@GetMapping("/del")
public Result del(){
String id="1";
Result del = ef.del(id);
return del;
}
@GetMapping("/update")
public Result update(Emp emp){
String id="1";
Result del = ef.update(id,emp);
return del;
}
}
没有连接数据库,在url地址直接输入测试